|
![]() | 作者: tetley [tetley]
![]() |
登录 |
我用WINAPI做一个简单网络通讯的程序, 用RECVFROM接受数据, 用UDP. 但用RECVFROM时会停止主线程, 所以我想用CreateThread创建一个线程, 但我的那些函数象socket, bind, sendto, recvfrom都是用我自己的类封装好的, 所以我想将CreateThread也封装在那个类中, 但不知怎么回事, 我在类中建一个ThreadFunction, 传入sockfd值, CreateThread老是给出错误信息,说ThreadFunction的型和要求的不一样. 我用DWORD CALLBACK ThreadFunction(void *) CreateThread(0,0,ThreadFunction, &(this->sockfd), 0, &ThreadID); 这是怎么回事? 是不是在自定义类中不能加多线程? 我在主程序中用相同的源码就工作的很好. 我用的BCB.但不想用VCL, 正学着用WINAPI. 如果这个成了的话我想弄一个抓屏的程序. 请多指教. [此贴被 tetley(tetley) 在 12月01日09时34分 编辑过] |
地主 发表时间: 12/01 09:09 |
![]() | 回复: TomyChen [quest] ![]() |
登录 |
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); LPVOID == Pointer to any type. 来自MSDN |
B1层 发表时间: 12/02 13:53 |
![]() | 回复: 286 [unique] ![]() |
登录 |
如果用RECVFROM时会停止主线程,那新线程也会停止。 sockfd是干什么用的? |
B2层 发表时间: 12/02 17:19 |
![]() | 回复: tetley [tetley] ![]() |
登录 |
终于有人回了.^_^ SOCKET sockfd; 我想将RECVFROM 单独放在一个线程中, 行不行呢? 就象把RECVFROM 放在 ThreadFunction中. 如果不行的话, 那应用什么才可以呢? 我用的UDP. 还有能不能推荐本书或解释一下WINAPI 各种类型的定义, 象DWORD, LPVOID,..... 我看这么多TYPE, 头都大了. 谢谢了.:-) |
B3层 发表时间: 12/02 18:56 |
![]() | 回复: TomyChen [quest] ![]() |
登录 |
在进程程里开一条线程出来Recvfrom。 像我一般在MFC中的做法是: public:CWinThread 然后实现CWinThread的Run。就是常说的UI线程,在主程序启动后就开始Recv。但是没有在CBC下面试过:( 最好把代码帖得详细点,因为好多地方靠猜是猜不出来的:( |
B4层 发表时间: 12/02 21:33 |
![]() | 回复: tetley [tetley] ![]() |
登录 |
在BCB中也有TThread, 但是是要继承才能用的. 但是是VCL. DWORD WINAPI ThreadFunction(void * p) { int length = p->remotehost; recvfrom( p->sockfd, p->buffer, p->buffersize, (struct sockaddr *) &p->remotehost, &length); } 主要的就是上面的了. 有些没用的没写. 然后用 UDPCLASS A;(<---自定义的类) CreateThread(0,0,ThreadFunction, &(A), 0, &ThreadID); 加线程. 是从书上抄的. 大体意思好象是 用THREADFUNCTION, 将this->sockfd传过去, 因为P 是VOID* 型的或改成LPVOID, 所以可以是任何型. 不知对不对? [此贴被 tetley(tetley) 在 12月03日03时46分 编辑过] |
B5层 发表时间: 12/03 03:13 |
![]() | 回复: TomyChen [quest] ![]() |
登录 |
好像CBUILDER里,还要做一个优选级设置吧? |
B6层 发表时间: 12/03 08:12 |
![]() | 回复: 286 [unique] ![]() |
登录 |
一个小游戏[附源程序] |
B7层 发表时间: 12/03 09:10 |
![]() | 回复: 286 [unique] ![]() |
登录 |
在线程中当然可以了. 我前几天把一个程序及源程序都发到网上了.其中用到了多线程,你可以看看,前两天我把他转到"软件开发"里了,你去找找,名子叫"一个小游戏[附源程序]". 里边利用CSocket类实现的. |
B8层 发表时间: 12/03 09:12 |
![]() | 回复: tetley [tetley] ![]() |
登录 |
286, 你的那个程序我看了一下SURROUND.CPP 和SOCKCONNECT.CPP.你继承的CSocket类, 但在你在Surround调用SockConnect时并没有用多线程.如果你想在里面加多线程, 你是要在SockConnect中继承CWinThread, 还是用WINAPI 实现? 怎么做? 在自定义的类中能不能用WINAPI 的CreateThread 加线程,而不在主程序中实现? Tomy, 我找到的一个简单的多线程程序: DWORD CALLBACK ThreadFunc(void *p) { HDC DC=GetDC(Form1->Handle); for(int i=0;i<1000000;i++){ String s=i; TextOut(DC,10,10,s.c_str(),s.Length()); } ReleaseDC(Form1->Handle,DC); return 0; } DWORD ThreadID; HANDLE hthread=CreateThread(0,0,ThreadFunc,0,0,&ThreadID); if(hthread==0) ShowMessage("NO Thread"); 它就是这么简单实现的, 能运行, 但我把ThreadFunc中的内容替换为Recvfrom就编译出错了. :( (都在主程序中). 我还没把CreateThread 加到我自定义的类中呢. 这是怎么回事? 是不是Recvfrom不能用在多线程中? 还有你说的优先级是怎么回事? 找不到呀? |
B9层 发表时间: 12/04 03:11 |
![]() | 回复: TomyChen [quest] ![]() |
登录 |
等等啊,我得装一个C++Builder看帮助![]() |
B10层 发表时间: 12/04 08:19 |
![]() | 回复: tetley [tetley] ![]() |
登录 |
哇, 多谢多谢. 麻烦你了^_^ 要不你再教教我怎么自学成才吧 :) 靠, 说出来真脸红 :-) |
B11层 发表时间: 12/04 08:36 |
![]() | 回复: shesh [shesh] ![]() |
登录 |
线程函数怎么能用回调声明呢? 应该是UINT WINAPI func(LPVOID lPvoid); |
B12层 发表时间: 12/04 09:45 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号