使用 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 可能會更 可靠。