一个线程小问题,88分不够再加。

wanghu 2001-04-27 10:19:00
我在cmyview的oninitialupdate()中这样写:
int iid[20];
int i;
for(i=0;i<12;i++)
iid[i]=i;

for(i=0;i<12;i++)
AfxBeginThread(TheThreadProc,&(iid[i]), THREAD_PRIORITY_NORMAL);

而TheThreadProc中:
UINT TheThreadProc(LPVOID pParam)
{
int i;
char ii[100];
i=*((int *)pParam);
itoa(i,ii,10);
AfxMessageBox(ii);
return 1;
}
结果多次执行,结果不一样
有几次弹出的对话框是从0到11(次序不一定),正确。
有几次弹出的却是从0到10,加上一个其他数(641,123435等不定),这是为什么?
I'm tired,help,help,hellllllllllllllllp.
...全文
150 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
dusj 2001-04-29
  • 打赏
  • 举报
回复
sorry, 我的程序忘了加变量赋初值。
dusj 2001-04-27
  • 打赏
  • 举报
回复
vcbear & lms are right!
you can do like this if you wan't to use global varible.
in oninitialupdate():
int *iid[20];
int i;
for(i=0;i<12;i++)
iid[i]=new int;

for(i=0;i<12;i++)
AfxBeginThread(TheThreadProc,iid[i], THREAD_PRIORITY_NORMAL);

in TheThreadProc:
UINT TheThreadProc(LPVOID pParam)
{
int i;
char ii[100];
i=*((int *)pParam);
itoa(i,ii,10);
AfxMessageBox(ii);
delete (int *)pParam;
return 1;
}
in this way, your variable was in heap but not in stack.

gongxy 2001-04-27
  • 打赏
  • 举报
回复
int iid[20]; must be global varible !!!
wanghu 2001-04-27
  • 打赏
  • 举报
回复
打击:-(
vcbear 2001-04-27
  • 打赏
  • 举报
回复
强制转换嘛:
(LPVOID)(iid[i])
wanghu 2001-04-27
  • 打赏
  • 举报
回复
再问几位大侠:
如何直接传值?thethreadproc的参数是lpvoid。。。
唉,菜鸟难呐.
wanghu 2001-04-27
  • 打赏
  • 举报
回复
还是几位说的对。我再试试.
vcbear 2001-04-27
  • 打赏
  • 举报
回复
更正一点,i 不会跑到12, 最后一个是iid[11],已经赋值 。
vcbear 2001-04-27
  • 打赏
  • 举报
回复
是最后一个线程启动后,启动线程的函数马上返回,在函数里申请的栈上的所有局部变量被
销毁,所以iid[12]无效了。
其他能显示的只是因为线程跑到显示的地方时,启动线程的函数尚未返回而已。


vcbear 2001-04-27
  • 打赏
  • 举报
回复
就是局部变量的范围原因。要是不想设成全局的就直接传值吧,不不要传地址或引用。
wanghu 2001-04-27
  • 打赏
  • 举报
回复
出现一个其他数大概是因为i已经变到了12,最后一个线程才开始。而iid[12]未赋值。
这个倒好办。不过各个线程异步执行,很可能取重复的i,怎么办?用sleep能行吗?
kkk16 2001-04-27
  • 打赏
  • 举报
回复
你把那些变量设为全局的试试。
kkk16 2001-04-27
  • 打赏
  • 举报
回复
同意lms的说法。
wanghu 2001-04-27
  • 打赏
  • 举报
回复
大概是AfxBeginThread()异步执行的缘故吧?有没有办法解决?谢谢
lms 2001-04-27
  • 打赏
  • 举报
回复
AfxBeginThread只能保证线程被开始,但不能保证线程被运行到何处
在ThreadProc中i=*((int *)pParam);时iid[i]作为oninitialupdate局部变量可能已经出了
oninitialupdate的范围,可能已经无效了,因为是在栈上,可能被赋成其他值

ggyy 2001-04-27
  • 打赏
  • 举报
回复
次序不一定是线程没同步;
加上一个其他数(641,123435等不定),????
UINT TheThreadProc(LPVOID pParam)
{
int i;
String string;
i=*((int *)pParam);
string.format("%d",i);
AfxMessageBox(string);
return 1;
}
怎么样????
horris 2001-04-27
  • 打赏
  • 举报
回复
但是这样使第N个线程执行完才启动第N+1个线程
horris 2001-04-27
  • 打赏
  • 举报
回复
下面这样就能顺序执行,并且不会出现未知整数:
int iid[20];
int i;
for(i=0;i<12;i++)
iid[i]=i;

for(i=0;i<12;i++)
{
CWinThread* pThreadCls=AfxBeginThread(TheThreadProc,(LPVOID)iid[i], THREAD_PRIORITY_NORMAL);
WaitForSingleObject(pThreadCls->m_hThread);
}

而TheThreadProc中:
UINT TheThreadProc(LPVOID pParam)
{
int i;
char ii[100];
i=(int)pParam;
itoa(i,ii,10);
AfxMessageBox(ii);
return 1;
}
jsd198 2001-04-27
  • 打赏
  • 举报
回复
我也同意lms的,你用全局变量怎么样

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧