关于多线程调用同一函数的问题

luoweigang 2005-06-15 11:20:29
我想实现在主线程调用多个线程,但多个线程函数相同,只是传递的参数不同,请问应该怎样实现?我自己写了一小段测试,但总是不行,下面是我的代码,请教各位有什么问题,应该怎么改?

// 线程
UINT AThread(LPVOID lParam)
{
CString *a=(CString*)lParam;

AfxMessageBox(*a);
return 0;
}

void CThread3Dlg::OnButton1()
{
// TODO: Add your control notification handler code here

CString a="1";
CString b="2";

HANDLE threads[2];

threads[0]=AfxBeginThread(AThread,&a);
threads[1]=AfxBeginThread(AThread,&b);

DWORD dwRet2 = WaitForMultipleObjects(2,threads,true, INFINITE);
}
...全文
771 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoweigang 2005-06-19
  • 打赏
  • 举报
回复
我自己想到一个解决办法,麻烦各位帮我看看是否可行,我用new操作生成堆中的变量,然后用Createthread函数,我是这样做的:
CString *a = new CString;
CString *b = new CString;

threads[0]=CreateThread(NULL, 0,_SendThread, a,0,0);
threads[1]=CreateThread(NULL, 0,_SendThread, b,0,0);

DWORD dwRet2 = WaitForMultipleObjects(2,threads,true, INFINITE);

if(dwRet2==0)
{
delete a;
delete b;
AfxMessageBox("succeed!");
}
csdnyh 2005-06-18
  • 打赏
  • 举报
回复
AfxBeginThread返回的不是CWinThead类的指针么,怎么可以把它赋给一个句柄变量?
licry01 2005-06-18
  • 打赏
  • 举报
回复
MFC是挺方便的,但不一定好用,你可以试试用_beginthread和_beginthreadex

vodi __cdecl AThread(void*lParam)
{
sockaddr_in * new_val = (sockaddr_in*)lParam;
_endthread();
return;
}

void CThread3Dlg::OnButton1()
{
sockaddr_in a ,b;
HANDLE threads[2];
unsigned long tcode ;

threads[0]=(HANDLE)_beginthread(AThread,0,(void*)&a);
thread[1]=(HANDLE)_beginthread(AThread,0,(void*)&b);

DWORD dwRet2 = WaitForMultipleObjects(2,threads,true, INFINITE);
}
这要不行,就试试_beginthreadex
stevecrisewu 2005-06-17
  • 打赏
  • 举报
回复
把CThread3Dlg作为参数传进去
luoweigang 2005-06-17
  • 打赏
  • 举报
回复
能不能用程序说明一下,举一下例子,这样说太抽象
忠向 2005-06-17
  • 打赏
  • 举报
回复
codewarrior(会思考的草) 的是正解!
使用HEAP,不要使用STACK上的变量!
会思考的草 2005-06-16
  • 打赏
  • 举报
回复
线程在一个进程的地址空间中,所以用堆,或者全局变量都可以,但是不要使用局部变量,因为局部变量是存放在各个线程的TLB中的。
会思考的草 2005-06-16
  • 打赏
  • 举报
回复
CString*作为参数不行,MFC不是线程安全的类库。
kuoxin 2005-06-16
  • 打赏
  • 举报
回复
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
注意你的返回值。
threads[0]=AfxBeginThread(AThread, (LPVOID)a)->m_hThread;
threads[1]=AfxBeginThread(AThread, (LPVOID)b)->m_hThread;
这样就可以了。当前在你的测试代码中不需要考虑代码重入问题。
luoweigang 2005-06-16
  • 打赏
  • 举报
回复
to kuoxin(了了):
threads[0]=AfxBeginThread(AThread, (LPVOID)a)->m_hThread;
threads[1]=AfxBeginThread(AThread, (LPVOID)b)->m_hThread;
是什么意思,能不能给出详细的例子,最好传递参数是sockaddr_in类型

还有,如果是局部变量连传址过去也不行吗,为什么我用Sleep()会没问题呢?
luoweigang 2005-06-16
  • 打赏
  • 举报
回复
请问我想传递的参数是sockaddr_in类型的变量,应该怎么传递呢?
luoweigang 2005-06-16
  • 打赏
  • 举报
回复
有没有人能针对传递sockaddr_in类型参数给出例子啊,其实我用CString也只是作试验而已,主要还是想传递sockaddr_in类型参数给线程
luoweigang 2005-06-15
  • 打赏
  • 举报
回复
to younggle(洋溢):好像真是这样,谢谢,还有一个问题,如果我想传递一个sockaddr_in类型的参数应该怎么做呢?
luoweigang 2005-06-15
  • 打赏
  • 举报
回复
to orbit:不可以这样传的吗?我运行的结果是有一个成功显示,有一个显示乱码,是什么原因?

to idAnts:我以后就是要在程序中取得变量然后传递给线程的

to beyondtkl:我的并没有共享变量,而且如果我将DWORD dwRet2 = WaitForMultipleObjects(2,threads,true, INFINITE);改为Sleep(10);则结果完全正确,我想应该是WaitForMultipleObjects的问题

哪位高手能帮我看看到底毛病出在哪里,应该怎么修改呢?谢谢!
younggle 2005-06-15
  • 打赏
  • 举报
回复
不能使用局部变量作为参数传递给线程。
楼主改为下面的就可以了。

// 线程
UINT AThread(LPVOID lParam)
{
char *value = (char *)lParam;
CString strValue = (CString)value;
delete [] value;

AfxMessageBox(strValue);

return 0;
}

void CThread3Dlg::OnButton1()
{
// TODO: Add your control notification handler code here

char *a = new char[32];
strcpy(a, "1");

char *b = new char[32];
strcpy(b, "2");

HANDLE threads[2];

threads[0]=AfxBeginThread(AThread, (LPVOID)a);
threads[1]=AfxBeginThread(AThread, (LPVOID)b);

DWORD dwRet2 = WaitForMultipleObjects(2,threads,true, INFINITE);
}


beyondtkl 2005-06-15
  • 打赏
  • 举报
回复
那你要考虑 线程安全。。。

应该要互斥访问 之类的。。
idAnts 2005-06-15
  • 打赏
  • 举报
回复
把CString a="1";
CString b="2";放到函数外面。
传到你线程里的时候这两个变量怎么样了还不知道呢。有可能已经析勾了。
idAnts 2005-06-15
  • 打赏
  • 举报
回复
把CString a="1";
CString b="2";放到函数外面。
传到你线程里的时候这两个变量怎么样了还不知道呢。有可能已经析勾了。
吹泡泡的小猫 2005-06-15
  • 打赏
  • 举报
回复
使用char *,不要在线程之间传递MFC的对象

15,471

社区成员

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

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