HelloOverflow的同事们,您好!
我会尽量简短,所以我会切入点:
我在Windows XP上使用C ++编写,使用纯Win32创建一个对话框。
该对话框有一些编辑控件和OK按钮,按下时会激活一个线程。
线程然后从编辑控件收集文本,并使用OLE自动化将它们写入MS Word文档。
当我按下OK按钮,等待线程显示填充的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应用程序会随线程销毁一起关闭?
如果还有其他任何我可以提供的帮助,请问,我很乐意这样做。
感谢所有试图提供帮助的人。
答案 0 :(得分:-2)
如果使用WinApi,则必须通过代码的其他部分访问threadhandle。 然后,要终止您的线程,您可以使用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函数即可。它一直等到线程关闭。 这只是建议不是最终的解决方案,所以你可以在将来重构它。