多线程崩溃的问题

[复制链接]
查看11 | 回复9 | 2021-1-27 06:09:31 | 显示全部楼层 |阅读模式
我创建了一个定时器,每隔一秒钟去创建一个线程执行一个函数,但是代码跑了一会之后就崩溃了,代码如下:
voidCTestTradingDayInterfaceDlg::OnBnClickedIsTradeDay()
{
//TODO:Addyourcontrolnotificationhandlercodehere
//获取当前系统时间
CTimestartTime=CTime::GetCurrentTime();
CStringstrTime=startTime.Format("%Y%m%d%H%M%S");
CTimeSpantmSpan(0,2,0,0);
CTimetime=startTime+tmSpan;
IsTradingDayEndTime=time.Format("%Y%m%d%H%M%S");
//设置定时器属性
SetTimer(1,1000,NULL);
}
voidCTestTradingDayInterfaceDlg::OnTimer(UINT_PTRnIDEvent)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
switch(nIDEvent)
{
//执行多线程中的IsTradeDay按钮事件
case1:
{
CTimetime=CTime::GetCurrentTime();
CStringcurrentTime=time.Format("%Y%m%d%H%M%S");
//判断当前线程执行事件有没有到个5小时,如果到5个小时就退出,否则继续运行。
if(currentTime.Compare(IsTradingDayEndTime)!=0)
{
CWinThread*pMyFirstWorker,*pMySecondWorker,*pMyThreeWorker;
LPVOIDpParam=NULL;
//创建一个新线程,用来运行IsTradeDayThread1函数
pMyFirstWorker=AfxBeginThread((AFX_THREADPROC)IsTradeDayThread1,pParam);
if(!pMyFirstWorker)
{
AfxMessageBox("执行IsTradeDayThread1函数的线程创建失败!");
return;
}
//创建一个新线程,用来运行IsTradeDayThread2函数
pMySecondWorker=AfxBeginThread((AFX_THREADPROC)IsTradeDayThread2,pParam);
if(!pMySecondWorker)
{
AfxMessageBox("执行IsTradeDayThread2函数的线程创建失败!");
return;
}
//创建一个新线程,用来运行IsTradeDayThread3函数
pMyThreeWorker=AfxBeginThread((AFX_THREADPROC)IsTradeDayThread3,pParam);
if(!pMyThreeWorker)
{
DWORDtemp=GetLastError();
AfxMessageBox("执行IsTradeDayThread3函数的线程创建失败!");
return;
}
}
default:
break;
}
程序跑了一会之后就不停的弹出警告框:“执行IsTradeDayThread1函数的线程创建失败!”,“执行IsTradeDayThread2函数的线程创建失败!”,:“执行IsTradeDayThread3函数的线程创建失败!”

请问程序有什么问题?应该怎样改呢?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
创建得太多线程了?GetLastError是什么
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
帮我改一下代码吧

回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
晕死,你如果要1秒钟处理一次,你搞多线程干嘛,直接将你要处理的东西封装成三条函数,在定时器中调用不就行了
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
没必要搞这么多线程出来啊,只有必要的时候才需要使用线程。单纯的处理,函数调用就可以了。
King_hhuang说的对。
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
用一个线程做循环就可,根据全局或参数变量处理不同的任务或结束线程

回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
哎不要为了使用线程而使用线程
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
AfxMessageBox会阻塞住主线程吗?
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
在WIN32系统中,最多只允许1024个线程。
因为1个线程的线程栈大小为1MB,而进程
能使用的内存大小为2GB=2*1024MB,
所以最多只能创建2*1024个线程。创建过多
的线程后,就不能再创建了。
回复

使用道具 举报

千问 | 2021-1-27 06:09:31 | 显示全部楼层
写错了。。是2048个线程数。
线程运行时间过长,不退出,而又不停地创建线程。可能会出现此种情况。
可能加变量,进行打印。
不过最好用GetLastError查看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行