用ATL COM写的DLL MFC程序调用 求如何在DLL中添加一个关闭进程的方法 atlmfc对话框进程COM 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我觉得这个应该程序的 BUG,不应该这么解决。应该修改在程序关闭的时候,就是关闭了。 我手上有个别人写的DLL 和我的功能一样 他的就可以关闭进程 但是 我套用他的相关语句 结果还是不行 不知道怎么回事 这个会不会是MFC程序的问题,如果不加载com组件会不会正常退出呢。 实在不行这个dll什么都不做看还会不,如果不会就逐渐添加。感觉像是退出时阻塞在哪里了 关闭MFC的对话框 但是ABC.exe这个进程还是存在 就会导致之前用的那个串口一直被占用 要是再次打开ABC 就无法执行功能了 除非先在任务管理器手动结束进程 然后再打开ABC 就可以了 你的MFC关闭是不是先释放窗体再去断开串口的?可能是关串口的时候一直卡在那里了或者是关串口时有等待操作没返回,所以导致窗体没了任务管理器中有没有结束的进程,而结束进程后串口又可以用了的问题。 关闭MFC的对话框 但是ABC.exe这个进程还是存在 就会导致之前用的那个串口一直被占用 要是再次打开ABC 就无法执行功能了 除非先在任务管理器手动结束进程 然后再打开ABC 就可以了 你的MFC关闭是不是先释放窗体再去断开串口的?可能是关串口的时候一直卡在那里了或者是关串口时有等待操作没返回,所以导致窗体没了任务管理器中有没有结束的进程,而结束进程后串口又可以用了的问题。我的串口操作相关函数用的是封装好的SerialPort 类 刚才下载源代码看了下 他里面的结束函数是BOOL CSerialPort::StopMonitoring(){ SuspendThread(m_Threadhandle); return TRUE; }这个SuspendThread貌似是挂起线程吧?是不是不能挂起 要用杀死线程的语句才可以? 那杀死线程用什么语句呢 我的串口操作相关函数用的是封装好的SerialPort 类 刚才下载源代码看了下 他里面的结束函数是BOOL CSerialPort::StopMonitoring(){ SuspendThread(m_Threadhandle); return TRUE; }这个SuspendThread貌似是挂起线程吧?是不是不能挂起 要用杀死线程的语句才可以? 那杀死线程用什么语句呢 SuspendThread是挂起线程,这个API使用起来有一定危险性。如果要退出了当然是要把线程结束,结束线程最标准的做法就是让线程函数return。我经常的做法就是通过修改标志位或者事件通知来让线程循环退出,线程函数自动return,为了确保线程结束,会waitforsingleobject这个线程句柄,一般等个几秒,如果还没等到就只好暴力退出了TerminageThread 谢谢啊 那这个TerminageThread的用法是什么呢 我上面是SuspendThread(m_Threadhandle); 那现在就是TerminageThread(m_Threadhandle,0);就行了么 另外我刚才编译的时候提示TerminageThread未定义 这个函数的头文件是什么呢? 不能这样,看看你有没有执行 CSerialPort 那个类的析构函数。这个很重要的。在那个析构函数里面,肯定会激发一个事件。然后等待线程关闭。而这个线程将会被 串口线程检测到,当检测到这个事件的时候,这个线程就自动退出了。永远不要尝试强制结束一个线程。还有,这个有 StartMonining 的 CSerialPort 有 BUG 的。但是如果你不尝试多次创建和销毁就不影响程序的。 BOOL WINAPI TerminateThread( __inout HANDLE hThread, __in DWORD dwExitCode); 你指的构析函数是哪个呢。。我用的时候就是m_t.InitPort();m_t.StartMonitoring();m_t.WriteToPort(p);结束就是m_t.StopMonitoring(); 就用了这4个函数其中这个就是StartMonitoring的代码 您说的BUG是指什么呢?BOOL CSerialPort::StartMonitoring(){ if (!(m_Thread = AfxBeginThread(CommThread, this))) return FALSE; m_Threadhandle = (HANDLE)_beginthreadex( NULL, 0, CSerialPort::CommThread, this, CREATE_SUSPENDED, (UINT*)&m_uThreadId ); if(!m_Threadhandle) return FALSE; ResumeThread(m_Threadhandle); return TRUE; } 你说的是这个函数么CSerialPort::~CSerialPort(){ do { SetEvent(m_hShutdownEvent); } while (m_bThreadAlive); //TRACE("Thread ended\n");// WriteTrace(_T("Thread ended")); delete [] m_szWriteBuffer; memset(m_Recv,0,1024); m_Reclen=0;} 代码里面有这个函数 但是我不知道这是干什么用的 就没管 //TRACE("Thread ended\n");看看这个注释掉的 TRACE,就知道了。当打印这个 TRACE 的时候,就是告诉你,那个线程已经结束了。// 所以如果你的 CSerialPort 是 new 出来的,就要 delete .// 如果是其他类的程序,就要保证这个类被析构。但是我好奇怪哦,你的程序里面不是创建了两个Thrad 吗?还有一个在哪里结束的?? 这个问题很明显是你MFC程序或Com DLL中有线程没有结束导致的。进程中如果有线程没有被结束掉,那么进程是不会退出的。我感觉最有可能的是你com dll中处理串口的地方的线程,接收串口数据接口是阻碍的,所以一般都会用一个线程来处理,估计就是这个线程没结束。这是一个程序的缺陷,最好不要用强制的办法结束进程。 请问CListCtrl可以 创建 垂直表头吗 ? VC++ 如何实现自己绘制的图形放大选中区域 指针赋值问题 关于重载过CSplitterWnd::Create()函数问题 dll参数传递问题 组合框的列表框不能正确显示 如何更改文件的属性? 有没有办法让系统热键暂时失效? 100分请教如何利用SQL SERVER通过LAN导出数据! 寻求vss6.0c下载地址 鼠标拾取三维图形的坐标点问题 字符串 中有汉字用Format 为什么对不齐??
应该修改在程序关闭的时候,就是关闭了。
我手上有个别人写的DLL 和我的功能一样 他的就可以关闭进程 但是 我套用他的相关语句 结果还是不行 不知道怎么回事
关闭MFC的对话框 但是ABC.exe这个进程还是存在 就会导致之前用的那个串口一直被占用 要是再次打开ABC 就无法执行功能了 除非先在任务管理器手动结束进程 然后再打开ABC 就可以了
你的MFC关闭是不是先释放窗体再去断开串口的?可能是关串口的时候一直卡在那里了或者是关串口时有等待操作没返回,所以导致窗体没了任务管理器中有没有结束的进程,而结束进程后串口又可以用了的问题。
关闭MFC的对话框 但是ABC.exe这个进程还是存在 就会导致之前用的那个串口一直被占用 要是再次打开ABC 就无法执行功能了 除非先在任务管理器手动结束进程 然后再打开ABC 就可以了
你的MFC关闭是不是先释放窗体再去断开串口的?可能是关串口的时候一直卡在那里了或者是关串口时有等待操作没返回,所以导致窗体没了任务管理器中有没有结束的进程,而结束进程后串口又可以用了的问题。
我的串口操作相关函数用的是封装好的SerialPort 类 刚才下载源代码看了下 他里面的结束函数是
BOOL CSerialPort::StopMonitoring()
{
SuspendThread(m_Threadhandle);
return TRUE;
}这个SuspendThread貌似是挂起线程吧?是不是不能挂起 要用杀死线程的语句才可以? 那杀死线程用什么语句呢
我的串口操作相关函数用的是封装好的SerialPort 类 刚才下载源代码看了下 他里面的结束函数是
BOOL CSerialPort::StopMonitoring()
{
SuspendThread(m_Threadhandle);
return TRUE;
}这个SuspendThread貌似是挂起线程吧?是不是不能挂起 要用杀死线程的语句才可以? 那杀死线程用什么语句呢
我经常的做法就是通过修改标志位或者事件通知来让线程循环退出,线程函数自动return,为了确保线程结束,会waitforsingleobject这个线程句柄,一般等个几秒,如果还没等到就只好暴力退出了TerminageThread
谢谢啊 那这个TerminageThread的用法是什么呢 我上面是SuspendThread(m_Threadhandle); 那现在就是
TerminageThread(m_Threadhandle,0);就行了么 另外我刚才编译的时候提示TerminageThread未定义 这个函数的头文件是什么呢?
看看你有没有执行 CSerialPort 那个类的析构函数。这个很重要的。
在那个析构函数里面,肯定会激发一个事件。然后等待线程关闭。
而这个线程将会被 串口线程检测到,当检测到这个事件的时候,这个线程就自动退出了。
永远不要尝试强制结束一个线程。还有,这个有 StartMonining 的 CSerialPort 有 BUG 的。但是如果你不尝试多次创建和销毁就不影响程序的。
__inout HANDLE hThread,
__in DWORD dwExitCode
);
你指的构析函数是哪个呢。。我用的时候就是
m_t.InitPort();
m_t.StartMonitoring();
m_t.WriteToPort(p);
结束就是
m_t.StopMonitoring(); 就用了这4个函数
其中这个就是StartMonitoring的代码 您说的BUG是指什么呢?
BOOL CSerialPort::StartMonitoring()
{
if (!(m_Thread = AfxBeginThread(CommThread, this)))
return FALSE; m_Threadhandle = (HANDLE)_beginthreadex( NULL, 0, CSerialPort::CommThread, this, CREATE_SUSPENDED, (UINT*)&m_uThreadId );
if(!m_Threadhandle)
return FALSE; ResumeThread(m_Threadhandle); return TRUE;
}
CSerialPort::~CSerialPort()
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive); //TRACE("Thread ended\n");
// WriteTrace(_T("Thread ended"));
delete [] m_szWriteBuffer; memset(m_Recv,0,1024);
m_Reclen=0;
} 代码里面有这个函数 但是我不知道这是干什么用的 就没管
看看这个注释掉的 TRACE,就知道了。
当打印这个 TRACE 的时候,就是告诉你,那个线程已经结束了。// 所以如果你的 CSerialPort 是 new 出来的,就要 delete .
// 如果是其他类的程序,就要保证这个类被析构。但是我好奇怪哦,你的程序里面不是创建了两个Thrad 吗?
还有一个在哪里结束的??
这是一个程序的缺陷,最好不要用强制的办法结束进程。