外部中止线程
发表:
不详 阅读:
793次 关键字: 字体:[
大
中
小]
问:我有一个对话框,里面显示了一系列在一目录中可用的文件,我想当目录的
内容有所 变化时,对话框也能发生相应的变化,这需要从别的线程实现这个要
求,但怎样才能使该 线程能在对话框退出时同时关闭?
答:你可以做下面的一件事情就可以实现.
-在对话框中调用TerminateThread(handle, exitcode). -使用信号量,当你
想关闭线程时只需检查该标志罢了. -在线程中使用消息循环,然后从对话框
调用PostThreadMessage 2)谢谢大家的回复,在大家的帮助下我的问题
已经解决了,现写出来给大家作参考. 问题是有一个对话框,里面显示了一
系列在一目录中可用的文件,我想当目录的内容有所 变化时,对话框也能发
生相应的变化.其实用一个新线程以及使用WaitForSingleObject() 循环就
可以了.但似乎不容易在退出对话框时中止线程,解决方法包括建立一个私
有事件 用WaitForMultipleObjects()等待.具体如下
BOOL CLocalNotes::OnInitDialog()
{
Cdialog::OnInitDialog();
Cstring eventname; // Generate a unique event name
eventname.Format("Viewer %x", &eventname);
m_FinishedHandle = CreateEvent(NULL, false, false, eventname);
m_WatcherThread = AfxBeginThread(FileWatcher, this,
THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED, NULL);
m_NotifyHandle=::FindFirstChangeNotification(m_PatDir, false,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME);
m_WatcherThread->ResumeThread();
RefreshList(); // Generate the list of files
return TRUE;
}
....
Static UINT FileWatcher(LPVOID TheNote)
{
CLocalNotes *OurNote = (CLocalNotes*)TheNote;
HANDLE handle[2];
handle[0]=OurNote->NotifyHandle();
handle[1]=OurNote->FinishedHandle();
for (;;) {
if (::WaitForMultipleObjects(2, handle, false, INFINITE) ==
WAIT_OBJECT_0+1)
break; //
Finished notification
OurNote->RefreshList();
FindNextChangeNotification(OurNote->NotifyHandle());
}
return 0;
}
....
CLocalNotes::~CLocalNotes()
{
::SetEvent(m_FinishedHandle);
WaitForSingleObject(m_WatcherThread->m_hThread, INFINITE);
}
本文介绍了一个对话框应用程序如何通过创建一个独立线程来监控指定目录中的文件变更,并在对话框关闭时正确地中止该线程的方法。具体实现包括使用事件句柄和信号量进行线程间的同步。
2300

被折叠的 条评论
为什么被折叠?



