HANDLE hMutex;
DWORD ThreadID;
DWORD ThreadID_S;
class task_info
{
char* task_id;
public:
char* get_task_id()
{
return task_id;
}
void set_task_id(char* id)
{
task_id = id;
}
};
class task_pool
{
public:
int list_state;
list<task_info> *task_list;
};
list<task_pool> task_pool_list;
task_pool get_buzy_pool()
{
for ( list<task_pool>::iterator it = task_pool_list.begin () ; it != task_pool_list.end (); it ++ )
{
if((*it).list_state==1)
{
return (*it);
break;
}
}
}
task_pool get_free_pool()
{
bool flag = false;
for ( list<task_pool>::iterator it = task_pool_list.begin () ; it != task_pool_list.end (); it ++ )
{
if((*it).list_state==0)
{
return (*it);
flag = true;
break;
}
}
if(!flag)
{
task_pool *tp = new task_pool;
tp->list_state = 0;
tp->task_list = new list<task_info>;
task_pool_list.push_back(*tp);
return *tp;
}
}
#define MY_MSG WM_USER+100
DWORD WINAPI Thread_List_In(LPVOID lpParam)
{
while(1)
{
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
if(GetMessage(&msg,0,0,0)) //get msg from message queue
{
switch(msg.message)
{
case MY_MSG:
char * pInfo = (char *)msg.wParam;
printf("recv %s\n",pInfo);
delete[] pInfo;
break;
}
}
WaitForSingleObject(hMutex,INFINITE);
task_pool tp = get_free_pool();
for(int i=0;i<300;i++)
{
task_info *ti = new task_info();
ti->set_task_id("1");
tp.task_list->push_back(*ti);
}
tp.list_state = 1;
ReleaseMutex(hMutex);
Sleep(100);
}
//WaitForSingleObject(hMutex,INFINITE);
while(true)
//{
// for(int i=0;i<30000;i++)
// {
// task_info *ti = new task_info();
// ti->set_task_id("1");
// task_list->push_back(*ti);
// }
// if(task_list->size()>8000)
// {
// Sleep(1000);
// }
//}
//ReleaseMutex(hMutex);
return 0;
}
DWORD WINAPI Thread_List_Out(LPVOID lpParam)
{
for(int i=0;i<10;i++)
{
WaitForSingleObject(hMutex,INFINITE);
task_pool tp = get_buzy_pool();
cout<<"size--------- :"<<tp.task_list->size()<<endl;
char* pInfo = new char[10]; //create dynamic msg
sprintf(pInfo,"msg_%d",i);
if(!PostThreadMessage(ThreadID,MY_MSG,(WPARAM)pInfo,0))//post thread msg
{
printf("post message failed,errno:%d\n",::GetLastError());
delete[] pInfo;
}
//task_pool_list.remove(tp);
//tp.list_state = 0;
//tp.task_list->clear();
ReleaseMutex(hMutex);
Sleep(1000);
}
/*WaitForSingleObject(hMutex,INFINITE);
while(true)
{
cout<<"size--------- :"<<task_list->size()<<endl;
task_list->clear();
Sleep(1000);
}
ReleaseMutex(hMutex);*/
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
hMutex=CreateMutex(NULL,false,NULL);
HANDLE h_thread = CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE) Thread_List_In,
NULL, // no thread function arguments
0, // default creation flags
&ThreadID); // receive thread identifier
if( h_thread == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return 1;
}
DWORD ThreadID_S;
HANDLE h_thread_S = CreateThread(
NULL, // default security attributes
0, // default stack size
(LPTHREAD_START_ROUTINE) Thread_List_Out,
NULL, // no thread function arguments
0, // default creation flags
&ThreadID_S); // receive thread identifier
if( h_thread_S == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return 1;
}
//SetPriorityClass(h_thread,1);
//SetPriorityClass(h_thread_S,2);
Sleep(5000);
return 0;
}