c++ 高手帮忙看看我的代码为什么传递变量没成功

ngyouxi123 2012-09-01 08:38:56
#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>
#define THREAD_NUM 2

typedef struct TagScanInfo
{
int startip;
int endip; //传递变量
int isEnd;
}

ScanInfo,*PScanInfo;
ScanInfo info;
HANDLE g_hMutex;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
int idx = *(int*)lpParameter;
PScanInfo pinfo=(PScanInfo)lpParameter;
int s1 = pinfo->startip;//获取变量
int e1 = pinfo->endip;
for(;s1 < e1; s1++)
{
WaitForSingleObject(g_hMutex, INFINITE);
if( s1 < e1)
{
Sleep(25);
printf("线程%d %d\n",idx,s1);
ReleaseMutex(g_hMutex);
}
else
{
ReleaseMutex(g_hMutex);
break;
}
}
return 0;
}

int main(int argc, char *argv[])
{
int i=0,u=3;
int iEIP=0,JSIP=5;//设定变量
HANDLE* hThread = new HANDLE[u];
for(;i < u; i++)
{
info.startip = iEIP;
info.endip = JSIP;
g_hMutex=CreateMutex(NULL,FALSE,"MutexToRecive");
hThread[i]=CreateThread(NULL,0,Fun1Proc,&i,0,NULL);
Sleep(10);
}
SetEvent(g_hMutex);
WaitForMultipleObjects(i, hThread, TRUE, INFINITE);
CloseHandle(hThread[i]);
return 0;
}

运行结果是无限循环- - 为什么传递不成功?
...全文
174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ngyouxi123 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
你的代码能编译吗?帮你修改了!

C/C++ code


#include <stdio.h>
#include <windows.h>

typedef struct TagScanInfo
{
int startip;
int endip; //传递变量
int isEnd;
int idx;
}

ScanInfo,*PSc……
[/Quote]
谢谢朋友的帮忙 谢谢了~
但是 运行结果为:
线程0 0
线程1 0
线程0 1
线程2 0
线程1 1
线程0 2
线程2 1
线程1 2
线程0 3
线程2 2
线程1 3
线程0 4
线程2 3
线程1 4
线程2 4
而不是
线程0 0
线程1 1
线程2 2
线程0 3
线程1 4
不是设置循环到4 就结束循环吗?
mujiok2003 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:
你给线程传递的参数都不是TagScanInfo类型的...

朋友 其实typedef 那段不是我的原创
所以不懂 才来提问的 朋友能帮我修改错误的对方吗 谢谢了~
[/Quote]

hThread[i]=CreateThread(NULL,0,Fun1Proc,&i,0,NULL);//&i(类型为int*)会被传递到线程函数Fun1Proc, 而你在线程函数中需要参数为TagScanInfo*,而不是(int*)


mujiok2003 2012-09-01
  • 打赏
  • 举报
回复
你的代码能编译吗?帮你修改了!

#include <stdio.h>
#include <windows.h>

typedef struct TagScanInfo
{
int startip;
int endip; //传递变量
int isEnd;
int idx;
}

ScanInfo,*PScanInfo;
HANDLE g_hMutex = INVALID_HANDLE_VALUE;

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
PScanInfo pinfo = (PScanInfo)lpParameter;
int idx = pinfo->idx;
int s1 = pinfo->startip;//获取变量
int e1 = pinfo->endip;
for(;s1 < e1; s1++)
{
WaitForSingleObject(g_hMutex, INFINITE);
if( s1 < e1)
{
Sleep(25);
printf("线程%d %d\n",idx,s1);
ReleaseMutex(g_hMutex);
}
else
{
ReleaseMutex(g_hMutex);
break;
}
}
return 0;
}

int main(int argc, char *argv[])
{
int i=0,u=3;
int iEIP=0,JSIP=5;//设定变量
HANDLE* hThread = new HANDLE[u];
ScanInfo threadInfo[3];
for(;i < u; i++)
{
threadInfo[i].startip = iEIP;
threadInfo[i].endip = JSIP;
threadInfo[i].idx = i;
g_hMutex=CreateMutexA(NULL,FALSE,"MutexToRecive");
hThread[i]=CreateThread(NULL,0,Fun1Proc,&threadInfo[i],0,NULL);
Sleep(10);
}
SetEvent(g_hMutex);
WaitForMultipleObjects(i, hThread, TRUE, INFINITE);
for (int i = 0;i < 3; ++i)
{
CloseHandle(hThread[i]);

}
CloseHandle(g_hMutex);
delete [] hThread;
return 0;
}
ngyouxi123 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你给线程传递的参数都不是TagScanInfo类型的...
[/Quote]
朋友 其实typedef 那段不是我的原创
所以不懂 才来提问的 朋友能帮我修改错误的对方吗 谢谢了~
老王爱上猫 2012-09-01
  • 打赏
  • 举报
回复
你给线程传递的参数都不是TagScanInfo类型的...

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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