单击对话框关闭按钮时正确中止线程

时间:2013-08-10 16:39:05

标签: c++ multithreading winapi

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应用程序会随线程销毁一起关闭?

如果还有其他任何我可以提供的帮助,请问,我很乐意这样做。

感谢所有试图提供帮助的人。

1 个答案:

答案 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函数即可。它一直等到线程关闭。 这只是建议不是最终的解决方案,所以你可以在将来重构它。