社区
进程/线程/DLL
帖子详情
請教關於線程的一點問題,在線等待。
JXES智能生态系统
领域专家: 操作系统技术领域
2006-01-18 06:47:02
程序一運行時,就有十多次CreateProcess調用同一個程序的動作,然後用CreatePipe對執行後的結果進行補獲,為什麼程序運行半小時左右後就會死掉,是程序中線程開得太多的問題還是電腦系統裡的問題呢?請教!謝謝!
...全文
227
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是创建进程,不是线程。
应该是程序的问题,不过你的描述太模糊了,不好判断
JavaEE 初阶篇-深入了解多线程
等待
与多线程状态
t1.start() 立即创建 t1 线程,再 t2.start() 创建线程,t1 没有任何阻塞就会直接执行代码,而 t2 遇到了阻塞,需要
等待
t1 执行完毕之后,t2 才会解除阻塞,同时由于 main 线程阻塞了,需要
等待
t2 执行完毕,当 t2 执行完毕之后,main 线程解除阻塞了,执行 main 线程中的代码。main 线程调用 thread.join() ,就会阻塞 main 线程继续执行,会让 thread 线程执行完毕之后,main 线程解除阻塞,继续执行下去。
Java多线程下,线程之间如何实现互相
等待
在我们刚学Java的时候,程序在main中自上而下、顺序执行。后来在实习中接触到Java多线程的应用,多线程充分利用了单台服务器的计算资源,然后就根据服务器的load和cpu核数来调整程序的线程数。当时对多线程可能了解不太得深入,只能通过服务器负载来调整现成的数量。从当时的应用效果来看,对于线程之间不需要进行交互的应用场景来说(例如处理Kafka的数据),多线程技术真的是简单好用。
多线程初阶(三):线程
等待
&获取线程引用&线程休眠&线程状态
线程
等待
&获取线程引用&线程休眠&线程状态
MFC
等待
线程退出的方法
在MFC程序的主线程中如果使用WaitForSingleObject等线子线程,而子线程里使用了有关于消息的函数,比如SetWindowText,InsertItem,SetItemText这些函数,就有会导致主主线程阻塞问题优化函数OnBnClickedOk():主线程出现阻塞问题的原因是,因为SetWindowText调用了SendMessage,借助了消息循环,然后主线程又Waitxxxxx,必然会阻塞,最终导致工作线程Crash掉了。
关于主线程
等待
子线程的问题
线程本身就是被看作独立的执行片断。主线程不会
等待
子线程的 //同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直
等待
。 //在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前, // 主线程需要
等待
在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。 // 总结来说,CountDownLat...
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章