使用 libevent
主线程:
struct event_base*base = event_base_new();
event_base_dispatch(base);
发送数据线程:
unsigned _stdcall ThreadProc(void* param)
{
struct bufferevent * bev = (struct bufferevent *)param;
int iFrameNo = 1;
char szMsg[512];
memset( szMsg, 0, sizeof(szMsg) );
while (1)
{
printf("send packet : %d\n", iFrameNo++);
err = bufferevent_write(bev, szMsg, sizeof(szMsg));
size_t curlen = evbuffer_get_length(bev->output);
Sleep(5000);
}
return 0;
}
这种方式 发送不了 数据。 我的程序 base 放入一个 timeout, 也是以timeout 的 频率 进行。
struct timeval tv;
struct event evtPeriod;
/* Initalize one event */
event_assign(&evtPeriod, base, -1, EV_PERSIST, time_cb, (void*)bev);
tv.tv_sec = 5;
tv.tv_usec = 100*1000;
evtimer_add(&evtPeriod, &tv);
解决方法:
主线程 需要唤醒。 参见: https://bbs.csdn.net/topics/390523738
timeout 其实进行了 唤醒。
需要增加:
#ifdef WIN32
evthread_use_windows_threads();
#else
evthread_use_pthreads();
#endif
evthread_make_base_notifiable(base);
struct bufferevent*bev = bufferevent_socket_new(base, -1,
BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE );
增加 BEV_OPT_THREADSAFE 可能会更 可靠。