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

Abort thread properly when dialog box close button is clicked

本文关键字:线程 对话框 关闭按钮 单击      更新时间:2023-10-16

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