在YC++中编写多线程代码

news/2024/7/1 18:22:59

                                    在YC++中编写多线程代码

      在运行程序时,很多费时的操作或计算(如通过socket读网络文件, 解一个微分方程等等),都有可能使界面失去反应,这种现象叫做阻塞。如何解决阻塞问题呢?最好的办法就是使用多线程。
      在YC++编程中,多线程程序是很容易编写的。编写多线程程序最重要的一条就是尽量使用局部变量,
而不要使用全局变量(只读的除外)。因为使用全局变量容易出错。

/*****************************************************************************************************************/
下面这个例子用Win32函数CreateThread创建线程, 其用法是:

将下列代码存入名字任取的文件, 如: th.cpp
在yc++中, 用 <文件 打开或创建cpp源程序> 调入th.cpp, 再用 <工具 执行> 运行th.cpp
              或在dos中, 用 ycc th.cpp 生成 th.exe, 再运行th.exe
在vc++中, 用 cl th.cpp 生成 th.exe, 再运行th.exe


#ifndef YCC
#include       
#include        "include/ycapi.h"

#pragma         comment(lib, "gdi32.lib")
#pragma         comment(lib, "user32.lib")
#pragma         comment(lib, "yxbapi.lib")
#endif


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    /创建主窗口. 用YC++的API函数创建, 它不需要注册.
    int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData);
    HWND hwnd = YXB_Window(MainWndProc,NULL,0,
      WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU,
      "多线程",110,50,800,600,NULL,WT_WIN);

    MSG  msg;
    while(GetMessage(&msg,NULL,0,0))
      {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
      }
    return 0;
}

int WINAPI MainWndProc(HWND hwnd,UINT iMessage,UINT wParam,LONG lParam,void *pUserData)
{
    static HANDLE linep_thread_handle,rectp_thread_handle;
    switch(iMessage)
      {
 case WM_DESTROY:
      TerminateThread(linep_thread_handle,0);
      CloseHandle(linep_thread_handle);
      TerminateThread(rectp_thread_handle,0);
      CloseHandle(rectp_thread_handle);
      PostQuitMessage(0);
      return FALSE;
 case WM_CREATE:
      DWORD   linep_thread_ret, rectp_thread_ret;
      void draw_linep(LPVOID *my_buf), draw_rectp(LPVOID *my_buf);
      linep_thread_handle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)draw_linep,hwnd,0,&linep_thread_ret);
      rectp_thread_handle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)draw_rectp,hwnd,0,&rectp_thread_ret);
      return FALSE;
 case WM_PAINT:
      PAINTSTRUCT ps;
      BeginPaint(hwnd, &ps);
      YIMG yimg;
      memset(&yimg,0,sizeof YIMG);
      yimg.hdc = ps.hdc;     //通过这个设置, 可以将窗口客户区当作一幅图象来操作
      RECT mRect;
      GetClientRect(hwnd, &mRect);
      YXB_ImageFill(&yimg, 0, 0, mRect.right, mRect.bottom, RGB(130,150,160));
      EndPaint(hwnd, &ps);
      return FALSE;
      }
    return DefWindowProc(hwnd,iMessage,wParam,lParam);
}

const int  mycolor[]={0xff7766,0xcc88ff,0x6688aa,0xcc9977,0x88ff11,0x779911,0xdd88aa,0x55ccff};

void draw_linep(LPVOID *my_buf)
{
static int xx0=388,yy0=200;

    HWND hwnd = (HWND)my_buf;
    HDC hdc = GetDC(hwnd);
    RECT mRect;
    GetClientRect(hwnd, &mRect);
    MoveToEx(hdc,0,0,NULL);
    for(int ii=0; ; ii++)
      {
 HPEN hPen = CreatePen(PS_SOLID, 3, mycolor[ii%8]);
 HPEN hpenSave = (HPEN)SelectObject (hdc, hPen);
 LineTo(hdc,xx0,yy0);
 xx0 = rand()*mRect.right/2/RAND_MAX;
 yy0 = rand()*mRect.bottom/RAND_MAX;
 SelectObject (hdc, hpenSave);
 DeleteObject(hPen);
 Sleep(10);
      }
    ReleaseDC(hwnd,hdc);
}

void draw_rectp(LPVOID *my_buf)
{
static int xx0=0,yy0=0;

    HWND hwnd = (HWND)my_buf;
    HDC hdc = GetDC(hwnd);
    RECT mRect;
    GetClientRect(hwnd, &mRect);
    for(int ii=0; ; ii++)
      {
 HBRUSH hbr = (HBRUSH)SelectObject(hdc,CreateSolidBrush(mycolor[ii%8]));
 PatBlt(hdc,xx0,yy0,30,30,PATCOPY);
 DeleteObject(SelectObject(hdc,hbr));
 xx0 = rand()*mRect.right/2/RAND_MAX + mRect.right/2;
 yy0 = rand()*mRect.bottom/RAND_MAX;
 Sleep(10);
      }
    ReleaseDC(hwnd,hdc);





http://www.niftyadmin.cn/n/3654711.html

相关文章

在YC++中如何实现Ajax功能

在YC中如何实现Ajax功能在Web页面中&#xff0c;有时当用户点击一个按钮后&#xff0c;只有其中的一小块内容将要发生变化。在使用Ajax以前&#xff0c;一般必须刷新整个页面&#xff0c;无论页面中变化的部分还是没有变化的部分&#xff0c;都要从服务器中重新读取。使用Ajax后…

股票技术指标详解--移动平均线(MA)

移动平均线(MA) 移动平均线是应用非常广泛的一种技术指标。它构造简单&#xff0c;客观公正&#xff0c;不易人为操作骗线&#xff0c;受到很多股票投资者的青睐。 一、指数平均数的计算 所谓"移动平均线"是指一段时间内的算术平均线&#xff0c;通常以收盘价…

股票技术指标详解--指数平滑移动平均线(MACD)

指数平滑移动平均线(MACD) 一、指数平滑移动平均线 运用两条移动平均线相互背离&#xff0c;相互应证的交易法则&#xff0c;就可以得出指数平滑移动平均线(MACD)。它是运用快速和慢速移动平均线交叉换位、合并分离的特性加以双重平滑运算&#xff0c;来判断买卖时机。该指…

欢迎使用WINX!

WINX关注一个目标&#xff1a;简单而高效。它是一个C界面开发库&#xff0c;容易使用&#xff0c;兼容WTL。WTL是高效的&#xff0c;然而&#xff0c;它并不容易上手。官方博客&#xff1a;http://winxcn.blogspot.com/您可以在sourceforge获得WINX的最新版本&#xff1a;http:…

OWC学习笔记-Spreadsheet插入行/列

在owc提供的Spreadsheet api 中&#xff0c;没有直接添加行列的方法&#xff0c;可以使用执行命令的方式实现 添加新行在第3行&#xff0c;代码如下&#xff1a; varssConstants Spreadsheet1.Constants; Spreadsheet1.ActiveSheet.Row(3).Select(); Spreadsheet1.Command…

AOP, Signal/Slot, and Decoupling

解耦&#xff08;Decoupling&#xff09;是一个永恒的话题。本来没有打算这么早开始涉及“大型程序解耦”这一块内容&#xff0c;但是smithfox在winxcn论坛上提及相关的话题&#xff0c;所以决定还是在这里聊聊我对“解耦”的一些看法。面向方面编程&#xff08;AOP&#xff0c…

对比WINX,WTL,MFC,SmartWin代码效率

我们以Hello, World! 程序为例&#xff0c;对比一下各个界面库的代码效率。对于界面程序&#xff0c;个人认为空间效率较之时间效率要占据主导因素&#xff0c;故此这里比较的是空间效率。另外&#xff0c;由于优化的极限是直接用Windows SDK&#xff0c;故此对比亦加入Windows…