还是关于CreateThread的问题?请教高手!
CreateThread中要传参数怎么传!
是不是要用指针的指针才能传大结构啊?
所传参数在线程中如何使用?
希望能有CreateThread的详细用法与列子!
问题点数:100、回复次数:11Top
1 楼netsys2(来电!)回复于 2003-12-03 10:12:02 得分 20
在CB中,封装了Thread类。
你只要菜单 File--new--thread object就可以产生。
至于例子见examples\apps\threads.
传输参数很简单,什么样的都可以,例如函数都可以传入:
// 初始化后启动,参数:主窗口句柄,已连接的SOCKET,接收帧长,接收帧处理
void __fastcall XLongLinkThread::Init(HANDLE hwnd,char *host,long lport,TestPara *testpara)
{
memcpy( (char *)&m_TP,(char *)testpara,sizeof(TestPara));
for(int i=0; i<m_TP.packSendNum; i++)
memcpy(sendBuf + i*m_TP.sendPackLen,m_TP.onePack ,m_TP.sendPackLen);
m_testNum = 0;
this->Resume();
}
Top
2 楼HUANG_JH(保卫钓鱼岛)回复于 2003-12-03 10:39:03 得分 20
typedef struct tagParam
{
char Name[20] ;
int Sex ;
}TtagParam, *LPtagParam;
static DWORD WINAPI ReadCallBack( LPVOID pParm );
void __fastcall TForm1::Button6Click(TObject *Sender)
{
// 建立接收数据线程
DWORD ThreadId = 0;
TtagParam MyParam;
String strName = "Hello";
memset(MyParam.Name, 0 , 20 );
memcpy(MyParam.Name,strName.c_str(),strName.Length() );
MyParam.Sex = 1;
m_hMsgThread = CreateThread( NULL,
0,
ReadCallBack,
&MyParam ,
0,
&ThreadId );
if( m_hMsgThread == NULL )
{
CloseHandle( m_hMsgThread );
MessageBox( NULL,
"无法建立接收数据线程 ...... !!!",
"警告",
MB_OK | MB_ICONWARNING );
return;
}
}
//---------------------------------------------------------------------------
DWORD WINAPI ReadCallBack( LPVOID pParm )
{
int i ;
TtagParam *myPara = (TtagParam *)pParm;
//..............
while ( true )
{
if (i>500)
{
i = 0 ;
}
i++;
Sleep(100);
}
}
Top
3 楼NowCan(城市浪人)回复于 2003-12-03 12:55:40 得分 0
容易遇到的问题是编译时说参数类型不对,只要强制类型转换就可以了。Top
4 楼ruldalex(alex)回复于 2003-12-03 14:33:09 得分 0
我要winapiTop
5 楼ruldalex(alex)回复于 2003-12-03 14:38:11 得分 0
我要winapi的,
这问题已经暂时解决。
请问有没有谁遇到过sock = socket(PF_INET,SOCK_DGRAM,0);
第一次调用时返回值老是出错的问题啊?返回一个4294967295
第二次调用就正常了!
Top
6 楼NowCan(城市浪人)回复于 2003-12-03 18:18:11 得分 30
这个用WSAGetLastError看看是什么错误号,然后我们才能知道怎么回事。Top
7 楼ruldalex(alex)回复于 2003-12-04 08:38:24 得分 0
多谢几位的帮助。
特别是“NowCan(能量、激情、雨水、彩虹——雷雨云)”提醒我多看出错代码!谢谢!
sock = socket(PF_INET,SOCK_DGRAM,0);
第一次调用时出错代码是10093。
Top
8 楼ruldalex(alex)回复于 2003-12-04 09:43:46 得分 0
错误已找到。是还没调用WSAStartup函数。
我平时是在linux下的。
对C++ Builder 不太懂谁能说说像调用WSAStartup初始化winsock之类的要注意点吗?Top
9 楼NowCan(城市浪人)回复于 2003-12-04 17:38:34 得分 10
Windows是需要调用WSAStartup的,而且还有最后的WSACleanup
其他的也说不出来了,我不会Linux,所以不知道有什么区别。Top
10 楼Raptor(猛禽)回复于 2003-12-05 11:17:47 得分 10
Windows下用的WinSock和Linux下的BSD socket的差别之一
BSD socket支持的WinSock基本都支持,还有一些扩展功能通过WSA开头的一组API提供,详见MSDN中Winsock 2的部分Top
11 楼RomanticProgrammer() 兰企鹅||南极俺最帅 ()回复于 2003-12-05 13:20:08 得分 10
CreateThread的例子可以在MSDN上找到。
你可以葱TThread继承一个类来实现线程,比CreateThread简单的多。Top




