论坛: 编程破解 标题: 多线程问题。 复制本贴地址    
作者: 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号