单击对话框关闭按钮时,正确中止线程
Abort thread properly when dialog box close button is clicked
你好,StackOverflow的同事们!
我会尽量简短,所以我会切中要害:
我在WindowsXP上使用C++,使用纯Win32创建一个对话框。
该对话框有一些编辑控件和"确定"按钮,按下该按钮可激活线程。
线程然后从编辑控件中收集文本,并使用OLE Automation将其写入MS Word文档。
当我按下"确定"按钮,等待线程显示填充的Word文档时,一切都很好。
但是,当我按下"确定"按钮,然后关闭对话框时,当线程正在进行工作时,会弹出一个空白的Word文档
为了进一步说明我的问题,这里有一些代码片段:
这是线程函数的代码段:
DWORD WINAPI TabelaSvihObjekata( LPVOID hWnd ) // hWnd is handle of the Dialog box
{
// obtain dialogs window handle
HWND hwnd = (HWND)hWnd;
// Initialize COM for this thread...
CoInitialize(NULL);
// Get CLSID for our server...
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);
// do other Automation stuff and clean afterwards
}
在对话框中,这是按钮处理程序的代码段:
case IDOK:
{
// create thread
DWORD threadID;
HANDLE threadHandle = CreateThread( NULL , 0 ,
(LPTHREAD_START_ROUTINE)TabelaSvihObjekata ,
(void*)hwnd , 0 , &threadID );
if( !threadHandle )
{
MessageBox( hwnd, L"Error", L"Error", MB_ICONERROR );
EndDialog( hwnd, IDCANCEL );
}
CloseHandle( threadHandle );
}
这就是有问题的处理程序:
case IDCANCEL:
EndDialog(hwnd, IDCANCEL);
break;
我在MSDN上寻找线索,只找到了ExitThread作为解决方案,但我不知道如何正确使用它,因为我对线程缺乏经验。
浏览SO档案,我在C#中发现了一些例子,人们在while循环中引入布尔变量并测试它的值,这样他们就可以决定是中止线程还是让它工作。提出了另一种方法,将线程放在单独的进程中,然后终止。
我的问题是:
我应该添加或更改什么,这样当我关闭对话框时,Word应用程序就会随着线程破坏而关闭
如果我还有什么可以帮助的,请询问,我会很乐意的。
感谢每一个尽力提供帮助的人。
如果使用WinApi,则必须使线程句柄可由代码的其他部分访问。然后,要终止线程,您可以使用ExitThread——这是MSDN的首选选项。我向你展示如何使用它:
DWORD threadID;
HANDLE hthread;
void TerminateYourThread()
{
DWORD exitCode;
if(GetExitCodeThread(hThread,&exitCode) != 0) // check if your thread is active
{
ExitThread(exitCode); // terminating thread
if(CloseHandle(hThread)) // closing handle
{
//
}
}
}
void CreateYourThread()
{
hThread = CreateThread( NULL , 0 ,
(LPTHREAD_START_ROUTINE)TabelaSvihObjekata ,
(void*)hwnd , 0 , &threadID );
}
现在,当您想要终止线程时,只需调用TerminateYourThread函数。它等待线程关闭这只是一个建议,不是最终的解决方案,所以您可以在将来重构它
相关文章:
- 如何抓取指向Qt中弹出对话框的指针,该对话框阻止了QTest中的UI线程
- 如何在另一个线程中关闭 MFC 模式对话框并获取对话框返回值?
- 如何从另一个线程关闭对话框?QT
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 在std ::线程中打开MFC对话框
- 如何在对话框编辑框中显示来自 UI 线程类 Run() 函数的字符串
- 显示Q对话框时出现QT线程问题
- 关闭其他线程的对话框后无法从主窗口聚焦
- 关闭MFC对话框时多线程对象被破坏
- 线程退出时 DLL 中的 MFC 无模式对话框被销毁
- 在 MFC 对话框和自己的线程上的 OpenGL 控件之间传递消息
- 从线程 MFC 将返回值发送到对话框
- 工作线程使主线程MFC的对话框处于非活动状态
- 单击对话框关闭按钮时,正确中止线程
- 在c++中对来自其他正在运行的线程的消息对话框进行建模
- 进度条在多个对话框与线程
- MFC主UI线程工作和模态对话框
- 访问线程(MFC)中的主对话框变量
- 从Q线程影响Q对话框
- 创建可用于对话框的线程