0

你好,来自 StackOverflow 的同事们!

我会尽量简短,所以我会切入正题:

我在 Windows XP 上工作,在 C++ 中,使用纯 Win32 创建一个对话框。

该对话框有一些编辑控件和确定按钮,按下时会激活一个线程。

然后,Thread 从编辑控件中收集文本,并使用 OLE 自动化将它们写入 MS Word 文档。

一切正常,当我按下 OK 按钮并等待线程显示填充的 Word 文档时。

但是,当我按下 OK 按钮然后关闭对话框时,当线程处于工作中间时,会弹出一个空白 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 应用程序会随着线程破坏一起关闭?

如果还有什么我可以帮助的,请提出,我会很乐意这样做。

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

4

1 回答 1

-2

如果您使用 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 函数。它一直等到线程关闭。这只是建议而不是最终解决方案,因此您可以在将来对其进行重构。

于 2013-08-10T17:55:01.927 回答