龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++动态链接库编程之读者反馈与答复(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
请问有什么办法支持制作多线程DLL??能否给一个源码来? 回答: 在DLL中可以处理多线程,WIN32对于多线程的支持是操作系统本身提供的一种能力,并不在于

  请问有什么办法支持制作多线程DLL??能否给一个源码来?

  回答:

  在DLL中可以处理多线程,WIN32对于多线程的支持是操作系统本身提供的一种能力,并不在于用户编写的是哪一类程序。即便是一个控制台程序,我们都可以使用多线程:

#include <stdio.h>
#include <windows.h>
void ThreadFun(void)
{
 while(1)
 {
  printf( "this is new thread " );
  Sleep( 1000 );
 }
}
int main()
{
 DWORD threadID;
 CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFun, NULL, 0, &threadID );
 while(1)
 {
  printf( "this is main thread " );
  Sleep( 1000 );
 }
}

  观察程序运行的结果为在控制台窗口上交替输出this is main thread、this is new thread。

  我们来看下面的一个多线程DLL的例子。

  DLL程序提供一个接口函数SendInit,在此接口中启动发送线程SendThreadFunc,在这个线程的对应工作函数中我们使用原始套接字socket发送报文。参考微软出版的经典书籍《Windows核心编程》,我们发现,不宜在DLL被加载的时候(即进程绑定时)启动一个新的线程。

  这个线程等待一个CEvent事件(用于线程间通信),应用程序调用DLL中的接口函数SendMsg( InterDataPkt sendData )可以释放此事件。下面是相关的源代码:

  (1)发送报文线程入口函数

///////////////////////////////////////////////////////////////////////////
//函数名:SendThreadFunc
//函数功能:发送报文工作线程入口函数,使用UDP协议
////////////////////////////////////////////////////////////////////////////
DWORD WINAPI SendThreadFunc( LPVOID lpvThreadParm )
//提示:对于线程函数应使用WINAPI声明,WINAPI被宏定义为__stdcall
{
 /* 创建socket */
 sendSock = socket ( AF_INET, SOCK_DGRAM, 0 );
 if ( sendSock == INVALID_SOCKET )
 {
  AfxMessageBox ( "Socket创建失败" );
  closesocket ( recvSock );
 }

精彩图集

赞助商链接