写个串口程序,在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后才能往下跑怎么做呢?麻烦给出源程序,谢谢
源程序: 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后才能往下跑怎么做呢?麻烦给出源程序,谢谢
2.将主线程OnReadCom后要执行的某些操作放到一个消息响应函数中。
3.执行完OnReadCom后向主线程使用PostMessage发送一个消息,通知主线程可以执行某些操作了。
{
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;
}
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();
}
屏幕是不死了,可没等线程执行完下一条语句(next statement)就执行了?
这样你帮我解决第二个问题,屏幕有假死了?
怎么能保证两个都满足呢?
执行完想回到//next statement
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;
}
哥们,这个问题只是项目中的一段,等你TIMER里READ后,后面程序早跑完了,那READ出来的数据还要他干嘛???
你没理解意思,后续程序是处理READ出来的数据的啊!
所以你需要把你所有的
CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0, 0);
// 等待线程完成
WaitForSingleObject(m_hEndEvent , INFINITE);
//next statement
}
这些代码开一个线程,然后再开一个线程CreateThread
好像和这个问题有关,但我对多线程不熟,帮忙总结一下啊
CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunction,0,0, 0);
// 等待线程完成
WaitForSingleObject(m_hEndEvent , INFINITE);
//next statement 然后线程A中再创建线程
那也可以这样啊,写完COM口开了计时器就什么也不做了,程序由MessageLoop Idle。计时器到时间读com,读出来以后再调用数据处理函数不是一样吗?
不然你SLEEP不是也等吗?
我的意思是把你的数据处理部分的代码单独拿出来放一个函数里面,等OnTimer()到时间以后用。
MessageLoop Idle 什么意思?能否给个完整的说明
感谢各位高手,PhShentu 哥们,这个问题不是架构的问题,其实被我描述复杂了
怎么让程序既等待2秒,又不锁屏?
不过楼上说的我都试过不是等待但锁屏,就是不锁屏可也没等待
不过还是感谢各位,我再想想办法,办法总比困难多!
{
//其他操作,如屏幕显示等... if (wait_object_0 == WaitForSingleObject(hThread, 0))
{
//执行语句
}
}
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
下面的代码别是 阻塞 或大循环...
}
...
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();