我的程序是一个对话框的程序,从某个目录读取文件然后进行处理,为了不使程序忙于处理而不响应用户操作,然后我就开了个线程进行文件处理。流程如下:
class CProcessThread : public CWinThread
BOOL CProcessThread::InitInstance()
{
// TODO: perform and per-thread initialization here
//程序初始化,如初始化失败则返回FALSE
.......
return TRUE;
}
int CProcessThread::Run()
{
HANDLE h=FindFirstChangeNotification(m_Path,FALSE,FILE_NOTIFY_CHANGE_FILE_NAME);
while(1)
{
//读取目录下的文件,将新的文件放入文件列表
.....
//从列表中取出文件名,进行处理,其中要对MS SQL2000存取数据
.....//是一个自上而下的处理,程序经常在这没有响应,但这里面没有任何等待信号量的操作
//处理完后等待新的文件生成
if(FindNextChangeNotification(h)==0)
break;
while(WaitForSingleObject(h,50)!=WAIT_OBJECT_0)
{
MSG msg;
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if( msg.message == WM_QUIT )// 主线程要求退出
{
ExitInstance();
return CWinThread::Run();
}
}
}
}
操作系统为Win2000Server,机器为研华工控。以前发现经常在出现屏保后程序就没有响应,后来去掉屏保,去掉睡眠,大概快到三个小时,程序又没有响应了,且文件列表中的文件都还没有处理完。
这个问题困挠我很久了,以前的程序是命令行的,没有界面,也没有线程,处理正常,所以处理文件部分应该没有问题。
另外,为了表明程序在工作,我还加载了一个GIF类来显示GIF动画,它里面也开了一个线程。
问题就是这样,大家说说哪里可能会有问题啊?不胜感激!
你在while最後加一個sleep(n),n由你定,,因為你的while沒有停止,windows分的時間片全被你的線程給占了.多線程實際上沒有起到做用,或者你不要用RUN.
用WinThread::PostThreadMessage()激活線程中的函數.來處理你要完成的工作.這樣的話,線程的運作時間就完全由windows分配了...我做的CTI系統就是這樣的...運行的很好
UP
用sleep(..)或event(wiatforsingleobject())都可解决
同意
我想你不应该在PeekMessage 中使用 PM_REMOVE
你说的程序没有响应是什么现象?任务管理器里看到的你的进程的cpu占用率是多少?
根据你说的,我看跟sleep,waitforsingleobject 都无关。
另外,你使用消息队列的退出控制不好,不如直接用一个变量控制。
你为什么要用PeekMessage 将msg取走,又不处理?
你要么PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
要么加上
TranslateMessage(&msg);
DispatchMessage(&msg);
我百分百同意这位同志说的!
我开始时也是和您一样,后来改为消息驱动加信号量
因為你的while沒有停止,windows分的時間片全被你的線程給占了.多線程實際上沒有起到做用,或者你不要用RUN.
用WinThread::PostThreadMessage()激活線程中的函數.來處理你要完成的工作.這樣的話,線程的運作時間就完全由windows分配了...
以下好像有问题:
{
ExitInstance();
return CWinThread::Run();
}
Run函数在整个线程周期中之运行一次,函数退出时,也就是线程退出。这个函数的默认处理是不断的接收消息并分发消息。
==> while(WaitForSingleObject(h,50)!=WAIT_OBJECT_0)
这个处理正确吗?要确保有WaitForSingleObject(h,50)==WAIT_OBJECT_0成立的条件。
==〉if( msg.message == WM_QUIT )// 主线程要求退出
能得到这个消息吗?