求助!!
我目前做程序遇到一些关于多线程的问题。
我首先在主线程A中创建一个线程B。
然后B线程中执行一些功能,有一个自己的消息循环。
这个时候我用PostThreadMessage关闭线程B,但是线程B的一些资源就无法关闭(B是ActiveX,打开的WINWORD.EXE 无法自动退出)我该怎么样关闭线程B中打开的WINWORD.EXE(通过微软自带的任务管理器发现的)。我主要用的是ActiveX。
我是直接在网上下载一个sample,然后自己修改的。那个sample可以正常退出的。
我目前做程序遇到一些关于多线程的问题。
我首先在主线程A中创建一个线程B。
然后B线程中执行一些功能,有一个自己的消息循环。
这个时候我用PostThreadMessage关闭线程B,但是线程B的一些资源就无法关闭(B是ActiveX,打开的WINWORD.EXE 无法自动退出)我该怎么样关闭线程B中打开的WINWORD.EXE(通过微软自带的任务管理器发现的)。我主要用的是ActiveX。
我是直接在网上下载一个sample,然后自己修改的。那个sample可以正常退出的。
解决方案 »
- 往VC里复制数据变成了空白
- 求教怎么学DirectShow啊?
- 对话框的背景
- 虚函数 重载 覆盖 的问题。
- 请教如何改变列表框的滚动条的颜色?
- vc6.0中 我在一个程序中做得对话框能否导到另一个程序中使用?
- 如何实现odbc数据连接的自动化
- 请问如何判断目录是否存在?有没有WIN API
- 急!!! DLL 问题, 高手请看
- 请问各位大虾一个问题:在VC中怎么在进程管理器(ctrl+alt+del)中隐藏进程,小第急用,望指教,谢谢!
- 關於(char*)(_bstr_t)的類型的比較,如何才是正確的
- 采用拉模式的sourcefilter例子制作播放器,加载大媒体文件需要很长的等待时间解决办法!!!!
B:while (getMessage(msg))
{
if (msg == WM_QUIT) then
break;
}不明白什么资源不释放??线程退不出去一般就是死循环,阻塞,如果有进程死了,就用TerminateProcess干掉它
DWORD WINAPI tmpf (LPVOID lpParameter)
{
...................
pFR->MessageLoop();
return TRUE;
}
A的退出是这样的
PostThreadMessage(tempword,WM_CLOSE, 0,0);
PostThreadMessage(tempword,WM_QUIT, 0,0);
CloseHandle(hThreadWnd);//这里是关闭线程的HWND
-----------------------------------------------------------------------------------
为什么是CreateProcess呢?
还有我的线程是安全关闭了,是线程开的WINWORD.EXE无法关闭
PostThreadMessage(tempword,WM_CLOSE, 0,0);
PostThreadMessage(tempword,WM_QUIT, 0,0);并没有在B中交给pFR->MessageLoop(); 而是B自己处理了。我该如何设置才可以使B收到消息不自己处理而是交给pFR->MessageLoop(); 谢谢!!!
{
m_pSite=new CSite(++m_dwIDCounter, m_hWndClient, this); if (NULL==m_pSite)
return FALSE; m_pSite->AddRef(); //So we can free with Release /*
* Now tell the site to create an object in it using the filename
* and the storage we opened. The site will create a sub-storage
* for the doc object's use.
*/
if (!m_pSite->Create(pszFile, m_pIStorage))
return FALSE; m_fHaveObject=TRUE; //We created the thing, now activate it with "Show"
m_pSite->Activate(OLEIVERB_SHOW); //Force repaint to show "have object" message
InvalidateRect(m_hWndClient, NULL, TRUE);
UpdateWindow(m_hWndClient);
return TRUE;
}
while ( !PostThreadMessage(tempword,WM_QUIT, 0,0); ) Sleep(5);试试。
-------------------------------------------------------
我这样发送后似乎就直接把B线程结束了。而我的本意是把这个消息传送给B线程中的消息循环
pFR->MessageLoop();
然后我自己处理这些消息。
pFR->MessageLoop();
然后我自己处理这些消息。
-----------------------------------
1 你b线程有地方阻塞了
2 你有其他的循环截获了这个消息,
3 想不出来了应该不会直接结束的,你再仔细看看吧.
DWORD WINAPI tmpf (LPVOID lpParameter)
{
PCFrame pFR;
HWND hParent;
struct _ActiveFile_Param *ParamList = (struct _ActiveFile_Param *)lpParameter;
if(!lpParameter)
return FALSE;
pFR=ParamList->p;
hParent=GetHwndFromWidgetBank(ParamList->widget->parent);
pFR->Init((UINT)hParent,ParamList->x,ParamList->y,ParamList->width,ParamList->height);
printf("\nopen file......\n");
pFR->CreateObject((LPTSTR)(ParamList->filename));
SetEvent((*(TsActiveX *)((ParamList->widget)->data_struct)).hEvent);
pFR->MessageLoop();
printf("\nclose file......\n");
return TRUE;
}
PostThreadMessage(tempword,WM_QUIT, 0,0);我在A中是用上面两条调用的。
结果发现
printf("\nopen file......\n");
和
printf("\nclose file......\n");
都可以显示的。我估计问题在于B线程接受到消息WM_QUIT,然后就自己退出了。而我希望它可以把消息交给pFR->MessageLoop(); 由这个MessageLoop去处理
直接在
pFR->CreateObject((LPTSTR)(ParamList->filename));
SetEvent((*(TsActiveX *)((ParamList->widget)->data_struct)).hEvent);
后面写
pFR->Close();
Sleep(10000);
会发现WINWORD.EXE在任务管理器里面出来一会儿,然后就会消失。看来的确是和MessageLoop有关