windows執行緒池

2021-06-19 10:43:24 字數 4862 閱讀 3358

// serverdlg.cpp : 實現檔案

//#include "stdafx.h"

#include "server.h"

#include "serverdlg.h"

#include "afxdialogex.h"

#include "winsock2.h"

#include

#include

#include

#ifdef _debug

#define new debug_new

#endif

// 用於應用程式「關於」選單項的 caboutdlg 對話方塊

class caboutdlg : public cdialogex

;protected:

virtual void dodataexchange(cdataexchange* pdx);    // ddx/ddv 支援

// 實現

protected:

declare_message_map()

};caboutdlg::caboutdlg() : cdialogex(caboutdlg::idd)

void caboutdlg::dodataexchange(cdataexchange* pdx)

begin_message_map(caboutdlg, cdialogex)

end_message_map()

// cserverdlg 對話方塊

cserverdlg::cserverdlg(cwnd* pparent /*=null*/)

: cdialogex(cserverdlg::idd, pparent)

void cserverdlg::dodataexchange(cdataexchange* pdx)

begin_message_map(cserverdlg, cdialogex)

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

end_message_map()

extern int create_listen_thread(unsigned int listen_port);

// cserverdlg 訊息處理程式

bool cserverdlg::oninitdialog()

}// 設定此對話方塊的圖示。當應用程式主視窗不是對話方塊時,框架將自動

//  執行此操作

seticon(m_hicon, true);

// 設定大圖示

seticon(m_hicon, false);

// 設定小圖示

// todo: 在此新增額外的初始化**

create_listen_thread(8008);

return true;  // 除非將焦點設定到控制項,否則返回 true

}void cserverdlg::onsyscommand(uint nid, lparam lparam)

else

}// 如果向對話方塊新增最小化按鈕,則需要下面的**

//  來繪製該圖示。對於使用文件/檢視模型的 mfc 應用程式,

//  這將由框架自動完成。

void cserverdlg::onpaint()

else

}//當使用者拖動最小化視窗時系統呼叫此函式取得游標

//顯示。

hcursor cserverdlg::onquerydragicon()

typedef struct 

struct_client_msg;

socket socket_listen;

handle handle_server_listen_thread;//伺服器執行緒控制代碼

//void callback workcallback(ptp_callback_instance instance,pvoid context,ptp_work work)

////清空集合,並將socket事件放到等待集合裡

fd_zero(&fd_socket);

fd_set(p_clt_msg->socket_connected,&fd_socket);

//設定等待時間,調節這個值,可調整通訊超時時間

tv_socket.tv_sec  = 5;

tv_socket.tv_usec = 0;//80000;

//等待事件完成

fd_read_num = select(2,&fd_socket,null,null,&tv_socket);

if(fd_read_num>0)//事件完成

}else//超時後事件仍未完成

send(p_clt_msg->socket_connected,(char *)send_buff,10,0);

//關閉連線客戶端的socket

//closesocket(p_clt_msg->socket_connected);

//記憶體用完後,要釋放掉

heapfree(getprocessheap(),0,p_clt_msg);

heapfree(getprocessheap(),0,recv_buf);

sleep(10);

}return ;

}dword winapi server_listen_thread(void* lpparam)

//messagebox(null,"a client connected!","server",1);

//有客戶端連線到伺服器,則立即分配一塊記憶體來儲存客戶端socket資訊

p_clt_msg = (struct_client_msg *)heapalloc(getprocessheap(),0,sizeof(struct_client_msg));

if(p_clt_msg == null)

//拷貝客戶端socket資訊到分配的記憶體塊

p_clt_msg->socket_connected = connect_socket;

p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b1 = addr_client.sin_addr.s_un.s_un_b.s_b1;

p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b2 = addr_client.sin_addr.s_un.s_un_b.s_b2;

p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b3 = addr_client.sin_addr.s_un.s_un_b.s_b3;

p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b4 = addr_client.sin_addr.s_un.s_un_b.s_b4;

p_clt_msg->addr_client.sin_family = addr_client.sin_family;

p_clt_msg->addr_client.sin_port = addr_client.sin_port;

// 現在可以建立一些項,提交給執行緒池

ptp_work ptpwork = createthreadpoolwork(workcallback,p_clt_msg,&tcbe);// 建立乙個工作項

submitthreadpoolwork(ptpwork);    // 提交工作項

建立乙個新的執行緒來處理該客戶端連線

//handle_rev_data_thread = createthread(null,0,threadprocessclient,(void *)p_clt_msg,0,null);

//if(handle_rev_data_thread == null)//}

return 0;

}int create_listen_thread(unsigned int listen_port)

//獲取本機ip位址

if( gethostname(pc_name,sizeof(pc_name))==no_error )//獲取主機名稱

else

}else

//申請乙個socket做伺服器

socket_ser_listen = socket(af_inet,sock_stream,ipproto_tcp);

if(invalid_socket==socket_ser_listen)

//將本機的8008埠繫結到上面申請的伺服器socket

addr_in_ser.sin_family = af_inet;

addr_in_ser.sin_addr.s_addr =inet_addr(host_ip);

addr_in_ser.sin_port = htons(listen_port);

result = bind(socket_ser_listen, (struct sockaddr *)&addr_in_ser, sizeof(addr_in_ser));

if(socket_error==result)

//將伺服器socket置於監聽狀態

result = listen(socket_ser_listen,somaxconn);

if(socket_error==result)

//建立伺服器監聽執行緒

socket_listen = socket_ser_listen;//將伺服器socket放到全域性變數裡傳給伺服器執行緒,不能用

handle_server_listen_thread = createthread(null,0,server_listen_thread,(void *)&socket_listen,0,null);

if( null==handle_server_listen_thread )

return 0;

}

Windows系統執行緒池

需要強調的是下面這句 呼叫queueuserworkitem時傳入的object型別引數傳遞到任務過程,可以通過這種方式來向任務過程傳遞引數 如果任務過程需要多個引數 可以定義包含這些資料的類,並將其 強制轉換 為object資料型別 在ms提供的windows service的c 例程中,提供了乙...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...