写个串口程序,在SEND后等待2秒再READ
源程序:    OnWriteCom();    
   Sleep(2000);
            OnReadCom();  当很多此类操作累计到一起时,屏幕就假死了,还是Sleep导致的!
看有人介绍再开个线程,我的程序如下:{
       CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0, 0);
      //next statement
}INT ThreadFunction()
{
          OnWriteCom();    
 Sleep(2000);
          OnReadCom(); 
return TRUE;
}
屏幕是不死了,可没等线程执行完下一条语句(next statement)就执行了,这样不行啊,必须等OnReadCom后才能往下跑怎么做呢?麻烦给出源程序,谢谢

解决方案 »

  1.   

    OnReadCom(); 等待它返回...或者设置一个标志
      

  2.   

    1.在主线程中设定一个监听消息的循环
    2.将主线程OnReadCom后要执行的某些操作放到一个消息响应函数中。
    3.执行完OnReadCom后向主线程使用PostMessage发送一个消息,通知主线程可以执行某些操作了。
      

  3.   

    你到msdn看看CreateThread的例子。大概是在main里面等待thread结束,可以用event等同步也可以直接用handle, 如下:int main()
    {
        HANDLE hThread = CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0, 0);     
        WaitForSingleObject(hThread, INFINITE);
        //next statement ...
    } INT ThreadFunction() 

        OnWriteCom();    
        Sleep(2000); 
        OnReadCom(); 
        return TRUE; 

      

  4.   

    我在使用的C#代码,希望能帮您 
                           
    private static SerialPort port;
    port.Write(Send);
    ushtWaitCount = 0;
    do
    {
       System.Threading.Thread.Sleep(1);
       ushtWaitCount++;
    } while ((port.BytesToRead < ResponseLength) && (ushtWaitCount < 1000));
    if (ushtWaitCount >= 1000)
    {
       Response = "";
    }
    else
    {
       Response = port.ReadExisting();
    }
      

  5.   


    屏幕是不死了,可没等线程执行完下一条语句(next statement)就执行了?
    这样你帮我解决第二个问题,屏幕有假死了?
    怎么能保证两个都满足呢?
      

  6.   

    谢谢
    执行完想回到//next statement 
      

  7.   

    写完com口马上设置一个Timer,计时器时间到了以后在OnTimer()里面读com口。这么个小程序还另启线程不是高射炮打蚊子吗?
      

  8.   


    HANDLE hEndEvent = CreateEvent(NULL, FALSE, FALSE, NULL);{       CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0, 0); 
          // 等待线程完成 
          WaitForSingleObject(m_hEndEvent , INFINITE);
          //next statement 
    } STATIC WINAPI INT ThreadFunction(LPVOID  pParam) 

              OnWriteCom();    
              Sleep(2000); 
              OnReadCom(); 
              
              SetEvent(hEndEvent );
              return 0; 
      

  9.   


    哥们,这个问题只是项目中的一段,等你TIMER里READ后,后面程序早跑完了,那READ出来的数据还要他干嘛???
    你没理解意思,后续程序是处理READ出来的数据的啊!
      

  10.   

    因为你要回到next statement,就需要等待,而你这个代码在主线程中,就会阻塞界面。
    所以你需要把你所有的
    CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0, 0);
    // 等待线程完成
    WaitForSingleObject(m_hEndEvent , INFINITE);
    //next statement
    }
    这些代码开一个线程,然后再开一个线程CreateThread
      

  11.   

    按你说的问题是解决了,可是最初开的那个线程也回马上返回啊,他的下面也会有//next 这样的代码,也是必须等待的,总不能一直往上CREATE THREAD吧
      

  12.   

    大虾,帮忙看看http://hi.baidu.com/kayuii/blog/item/a006bc51e310af8a8d5430ab.html
    好像和这个问题有关,但我对多线程不熟,帮忙总结一下啊
      

  13.   

    既然你要等待,你就应该把next的放到第一个线程A中线程A:
    CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0, 0);
          // 等待线程完成
          WaitForSingleObject(m_hEndEvent , INFINITE);
          //next statement 然后线程A中再创建线程
      

  14.   


    那也可以这样啊,写完COM口开了计时器就什么也不做了,程序由MessageLoop Idle。计时器到时间读com,读出来以后再调用数据处理函数不是一样吗?
    不然你SLEEP不是也等吗?
    我的意思是把你的数据处理部分的代码单独拿出来放一个函数里面,等OnTimer()到时间以后用。
      

  15.   


    MessageLoop Idle 什么意思?能否给个完整的说明
      

  16.   


    感谢各位高手,PhShentu 哥们,这个问题不是架构的问题,其实被我描述复杂了
    怎么让程序既等待2秒,又不锁屏?
    不过楼上说的我都试过不是等待但锁屏,就是不锁屏可也没等待
    不过还是感谢各位,我再想想办法,办法总比困难多!
      

  17.   

    如果要不锁屏,就把WaitForSingleObject(hThread, INFINITE)改成WaitForSingleObject(hThread, 0),但是要这样子:while (条件)
    {
         //其他操作,如屏幕显示等...     if (wait_object_0 == WaitForSingleObject(hThread, 0))
         {
             //执行语句
         }
    }
      

  18.   

    1.别在界面线程执行 阻塞 操作,WaitForSingleObject,Sleep等
    2.CreateThread后WaitForSingleObject,等价于 阻塞了a.另开1个线程

    CreateThread(NULL,0,ThreadFunction,NULL,0,0);  
    } DWORD WINAPI ThreadFunction(LPVOID lparam) 

    OnWriteCom();    
    Sleep(2000); 
    OnReadCom(); 
    //next statement
    为什么不将代码放这里?
    return 0; 
    } b.另开2个线程
    HANDLE hEvent;

    CreateThread(NULL,0,ThreadFunction1,NULL,0,0); 
    CreateThread(NULL,0,ThreadFunction2,NULL,0,0);  
    } DWORD WINAPI ThreadFunction1(LPVOID lparam) 

    OnWriteCom();    
    Sleep(2000); 
    OnReadCom();SetEvent(hEvent);
    return 0; 
    }DWORD WINAPI ThreadFunction1(LPVOID lparam)
    {
    WaitForSingleObject(hEvent, INFINITE); 
    //next statement
    下面的代码要处理什么?
    }3.另开1个线程,界面线程执行//next statement后的代码

    CreateThread(NULL,0,ThreadFunction,hWnd,0,0); //hWnd窗口句柄
    } DWORD WINAPI ThreadFunction(LPVOID lparam) 

    OnWriteCom();    
    Sleep(2000); 
    OnReadCom(); 
    ::PostMessage((HWND)lparam,WM_WRITE_COM,0,0);
    return 0; 
    } 重载WM_WRITE_COM响应函数
    LRESULT MyWriteCom(WPARAM wParam, LPARAM lParam)
    {
    //next statement
    下面的代码别是 阻塞 或大循环...
    }
      

  19.   

    不用另开线程,有个很简单的方法可以做到:
    ...
    OnWriteCom();
    SleepWithoutBlock(2000);
    OnReadCom();
    ...void SleepWithoutBlock(int interval)
    {
        DWORD tick = GetTickCount();
        HANDLE h = GetCurrentThread();
        while( interval > 0 && MsgWaitForMultipleObjects(1, &h, TRUE, interval, QS_ALLEVENTS) != WAIT_TIMEOUT )
        {
            MSG message;
            while( PeekMessage(&message, NULL, 0, 0, PM_REMOVE) )
            {
                TranslateMessage(&message);
                DispatchMessage(&message);
            }
            interval -= GetTickCount() - tick;
            tick = GetTickCount();
        }
    }OnReadCom();