社区
进程/线程/DLL
帖子详情
請教關於線程的一點問題,在線等待。
JXES智能生态系统
领域专家: 操作系统技术领域
2006-01-18 06:47:02
程序一運行時,就有十多次CreateProcess調用同一個程序的動作,然後用CreatePipe對執行後的結果進行補獲,為什麼程序運行半小時左右後就會死掉,是程序中線程開得太多的問題還是電腦系統裡的問題呢?請教!謝謝!
...全文
220
7
打赏
收藏
請教關於線程的一點問題,在線等待。
程序一運行時,就有十多次CreateProcess調用同一個程序的動作,然後用CreatePipe對執行後的結果進行補獲,為什麼程序運行半小時左右後就會死掉,是程序中線程開得太多的問題還是電腦系統裡的問題呢?請教!謝謝!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
_____non______
2006-01-22
打赏
举报
回复
进程创建成功后要关闭内核计数
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
JXES智能生态系统
2006-01-21
打赏
举报
回复
怎么沒有人幫我啊,自己來頂一下吧
不知為什么,程序運行一段時間阻塞,而且電腦也因此而死掉,不知程序那裡出了問題
說明:我是在OnButton()中調用線程Thread(用AfxBeginThread來調用的),並且SendMessage(hwnd,WM_GARY,50,0);消息最終也是發給OnButton()的,所以我程序隻要一運行起來,就不會停下來的,請教高手了。
JXES智能生态系统
2006-01-21
打赏
举报
回复
還是自己來頂一下吧
有人可以幫我一下嗎?
JXES智能生态系统
2006-01-19
打赏
举报
回复
////////////////////////////
void Diagnotor1()
//DWORD WINAPI Diagnotor(LPVOID pParam)
{
char Temp[1024];
sprintf(Temp,"%s %s %s %s","diagnotor.exe",FileName,COMStr,BaudRateStr);
//AfxMessageBox(Temp);
//HWND hwnd = (HWND)pParam;
//SendMessage(hwnd,WM_GARY,3,0);
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
AfxMessageBox("Error On CreatePipe()");
//return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,Temp,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
AfxMessageBox("Error on CreateProcess()");
//return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
//char buffer_diagnotor[4096];
DWORD bytesRead;
while (true)
{
if(ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
strcpy(buffer_diagnotor1, buffer);
}
}
//////////////////////////////////////////////
UINT Thread(LPVOID pParam)
{
HWND hwnd = (HWND)pParam;
Diagnotor1();
Sleep(500);
strcpy(buffer_diagnotor11,buffer_diagnotor1);
if (! strstr(buffer_diagnotor11,"found on the target"))
{
SendMessage(hwnd,WM_GARY,50,0);
return FALSE;
}
else
{
char Temp[1024];
sprintf(Temp,"%s %s %s %s","prgflash.exe",FileName,COMStr,BaudRateStr);
//AfxMessageBox(Temp);
HWND hwnd = (HWND)pParam;
SendMessage(hwnd,WM_GARY,3,0);
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
AfxMessageBox("Error On CreatePipe()");
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,Temp,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
AfxMessageBox("Error on CreateProcess()");
return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
char buffer_gary[4096];
DWORD bytesRead;
while (true)
{
if(ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
strcpy(buffer_gary, buffer);
}
//AfxMessageBox(buffer_gary);
if(strstr(buffer_gary,"CRC comparison passed"))
i=1;
else
i=2;
if(i==1)
SendMessage(hwnd,WM_GARY,1,0);
if (i == 2)
SendMessage(hwnd,WM_GARY,2,0);
}
///////
Diagnotor1();
Sleep(500);
while (strcmp(buffer_diagnotor11,buffer_diagnotor1) == 0)
{
Diagnotor1();
}
if (strcmp(buffer_diagnotor11,buffer_diagnotor1) != 0)
Sleep(5000);
SendMessage(hwnd,WM_GARY,51,0);
SendMessage(hwnd,WM_GARY,50,0);
return TRUE;
}
////////////////////////////////////////
void CFWDlg::OnButton3()
{
// TODO: Add your control notification handler code here
m_ComboCOM1.GetLBText(m_ComboCOM1.GetCurSel(),COMStr);
m_ComboBaudRate1.GetLBText(m_ComboBaudRate1.GetCurSel(),BaudRateStr);
FileName = m_ShowFile1;
AfxBeginThread(Thread,LPVOID(this->GetSafeHwnd()),0,0,NULL);
}
上面這樣的代碼我在程序中用了十多次,這只是其中的一個例子,可是不知為什么,程序運行一段時間后就會死掉,同時整個電腦也死在那,是不是進程太多了的問題呢?補充說明,我的程序一運行后都是自動運行的,也就是不停地做這個動作循環,有那位高手可以幫我解答一下嗎,謝謝,在線等待!
JXES智能生态系统
2006-01-19
打赏
举报
回复
to: oyljerry(【勇敢的心】→ ㊣Relax√㊣)
是啊,運行一段時間就會阻塞住,導致整個電腦都死在那
有什么方法可以解決嗎?謝謝
oyljerry
2006-01-19
打赏
举报
回复
是不是阻塞住了
pomelowu
2006-01-18
打赏
举报
回复
CreateProcess是创建进程,不是线程。
应该是程序的问题,不过你的描述太模糊了,不好判断
Linux:多线程---线程控制(线程创建&&线程
等待
&&线程终止)
本文从线程控制出发,介绍了Linux多线程的线程创建、
等待
和终止。详细讲解了线程创建函数的参数与返回值,线程
等待
的相关问题及处理方式,线程终止的方法。还深入探讨了原生线程库,分析了C++11线程库与原生线程库的关系,以及用户级线程与内核轻量级进程的关系。
JavaEE 初阶篇-深入了解多线程
等待
与多线程状态
本文详细解释了Java中线程
等待
的两种主要方式——join()方法和Thread.sleep(),以及线程的不同状态(如新建、就绪、终止、
等待
、超时
等待
和阻塞)。通过实例展示了这些概念如何在实际编程中应用。
Java多线程下,线程之间如何实现互相
等待
本文介绍Java多线程中线程互相
等待
的并发工具类。对于线程需交互的场景,CountDownLatch可让多个线程
等待
某些任务完成后再继续,类似老师等学生交卷;CyclicBarrier可使线程彼此
等待
后一起执行,如学生互相
等待
到齐再考试,还说明了二者适用场景。
多线程初阶(三):线程
等待
&获取线程引用&线程休眠&线程状态
本文围绕Java线程展开,介绍了线程操作方法,如用join控制线程结束顺序,有普通
等待
和带超时时间
等待
;currentThread可获取当前线程引用;sleep用于线程休眠,实际休眠时间常超设定值,sleep(0)可缓解资源紧张。还阐述了Java线程的六种状态,包括NEW、TERMINATED等。
MFC
等待
线程退出的方法
本文介绍了在多线程环境中如何使用SendMessage和PostMessage进行线程间通信,强调了非阻塞的PostMessage在多数情况下的优势。同时,文章警告了直接在工作线程中操作MFC控件的潜在问题,并提出了通过消息机制在主线程中更新界面的建议。针对WaitForSingleObject可能导致的死锁问题,文章推荐使用MsgWaitForMultipleObjects来实现安全的线程
等待
和消息处理。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章