多用几个变量在ondraw中作为流程的控制不可以吗?

解决方案 »

  1.   

    采用线程来采集数据可以保持主界面线程是
    激活的,不被阻塞,可以随时终止采集过程。
    计算量若不大,可以放在主线程中,如下面
    代码,若计算量大,也可以采用计算线程,
    可以用类似下面的方法保持同步。线程之间可以用最简单的全局变量来共享数据。
    // 公共变量
    HANDLE gEvent[2];
    // gEvent[0] 开始采集数据
    // gEvent[1] 终止采集线程
    DWORD WINAPI GetDataThread(LPVOID pParam)
    {
    HWND hWnd = (HWND) pParam;
    ....... BOOL  bContinue = TRUE;
    DWORD dwEvent;
     
    while(bContinue)
    {
    dwEvent = WaitForMultiObjects(2,gEvent,FALSE,INFINITE);
    switch(dwEvent)
    {
    case WWAIT_OBJECT_0 :
    // 接收数据
    ...... // 接收完成
    ResetEvent(gEvent[0]);
    ::SendMessage(hWnd,DATA_READY,...,...);
    break;
    case WAIT_OBJECT_0 +1:
    ResetEvent(gEvent[1]);
    bContinue = FALSE;
    break;
    } // SWITCH
    } // WHILE LOOP END return 1;
    }void CXXXView::OnStart()
    {
    gEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
    gEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (gEvent[0] == NULL  and  and  gEvent[1] == NULL )
    {
    AfxMessageBox("CreateEvent Fail!");
    return;
    } DWORD  dwThreadId;
    HANDLE hThread; hThread = CreateThread(NULL,0,GetDataThread,(LPVOID)GetSafeHwnd(),0,&dwThreadId);

    if( hThread == NULL)
    {
    AfxMessageBox("Create GetData Thread Error!");
    return ;
    }

    CloseHandle(hThread); // 以上为启动采集线程的部分,可以在其他地方完成 // 采集数据只需: SetEvent(gEvent[0]);
    // 结束采集线程只需: SetEvent(gEvent[1]);
    }
    void CXXXView::OnDataReady() // 自定义消息
    {
     // 开始计算
     ..... // 计算完成,画图
     Invalidate(); // 调用OnDraw()或者直接在此写画图代码 // 重新采集数据
     SetEvent(gEvent[0]); ......
    }
      

  2.   

    coolview无话可说?无言以对?