recv也有个等待超时吧,我不用异步.怎么能立即很快关闭工作线程呢
#define PAGE_SIZE 100
#define LOG_CACHE 30
static unsigned int PageNum(Tqueue* pQueue);
static void FillLV(Tqueue* pQueue, unsigned int iPage, HWND hLV);
LRESULT CALLBACK FormProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static LONG Id;
static LONG nPage;
static LONG iPage;
static TV* pTV;
static HWND hTV;
static HWND hLV;
static HWND hSel;
static list<QUEUE_ITEM> lstDoneA;
static list<QUEUE_ITEM> lstQueuedA;
static list<QUEUE_ITEM> lstFailedA;
static list<QUEUE_ITEM> lstFilteredA;
static list<QUEUE_ITEM> lstDoneP;
static list<QUEUE_ITEM> lstQueuedP;
static list<QUEUE_ITEM> lstFailedP;
static list<QUEUE_ITEM> lstFilteredP;
static unsigned int nDoneA;
static unsigned int nQueuedA;
static unsigned int nFailedA;
static unsigned int nFilteredA;
static unsigned int nDoneP;
static unsigned int nQueuedP;
static unsigned int nFailedP;
static unsigned int nFilteredP;
RECT rt;
Tqueue* pQueue;
BOOL fDisplay = FALSE;
QUEUE_ITEM* qItem;
int i;
NMHDR* lpnmhdr;
switch (message)
{
case WM_INITDIALOG:
hTV = GetDlgItem(hDlg, IDC_Tree);
hLV = GetDlgItem(hDlg, IDC_LV);
hSel = GetDlgItem(hDlg, IDC_ItemSelected);
pTV = new TV(hTV);
lstDoneA.clear();
lstQueuedA.clear();
lstFailedA.clear();
lstFilteredA.clear();
lstDoneP.clear();
lstQueuedP.clear();
lstFailedP.clear();
lstFilteredP.clear();
nDoneA = nQueuedA = nFailedA = nFilteredA = 0;
nDoneP = nQueuedP = nFailedP = nFilteredP = 0;
pTV->update_stat();
pTV->update_text(ELEM_STATE, "Stopped");
pTV->update_text(ELEM_SPEED, "Speed");
pTV->update_text(ELEM_ELAPSED, "Elapsed time");
Id = ELEM_DONE_A;
pQueue = pTV->get_queue_by_id(ELEM_DONE_A+1);
nPage = PageNum(pQueue);
iPage = 0;
if (nPage != 0)
{
iPage = nPage-1;
FillLV(pQueue, iPage, hLV);
}
return TRUE;
case WM_INITMENUPOPUP:
if (!HIWORD(lParam))
{
HMENU hPopup = (HMENU) wParam;
if ((!g_iQ) && (nPage!=0) && (iPage>0)) EnableMenuItem(hPopup, IDM_FIRST, MF_BYCOMMAND | MF_ENABLED);
else EnableMenuItem(hPopup, IDM_FIRST, MF_BYCOMMAND | MF_GRAYED);
if ((!g_iQ) && (nPage!=0) && (iPage>0)) EnableMenuItem(hPopup, IDM_PREV, MF_BYCOMMAND | MF_ENABLED);
else EnableMenuItem(hPopup, IDM_PREV, MF_BYCOMMAND | MF_GRAYED);
if ((!g_iQ) && (nPage!=0) && (iPage<nPage-1)) EnableMenuItem(hPopup, IDM_NEXT, MF_BYCOMMAND | MF_ENABLED);
else EnableMenuItem(hPopup, IDM_NEXT, MF_BYCOMMAND | MF_GRAYED);
if ((!g_iQ) && (nPage!=0) && (iPage<nPage-1)) EnableMenuItem(hPopup, IDM_LAST, MF_BYCOMMAND | MF_ENABLED);
else EnableMenuItem(hPopup, IDM_LAST, MF_BYCOMMAND | MF_GRAYED);
int idx = ListView_GetHotItem(hLV);
if (idx == -1) EnableMenuItem(hPopup, IDM_COPY, MF_BYCOMMAND | MF_GRAYED);
else EnableMenuItem(hPopup, IDM_COPY, MF_BYCOMMAND | MF_ENABLED);
if (idx == -1) EnableMenuItem(hPopup, IDM_GOTO, MF_BYCOMMAND | MF_GRAYED);
else EnableMenuItem(hPopup, IDM_GOTO, MF_BYCOMMAND | MF_ENABLED);
}
return TRUE;
case WM_NOTIFY:
lpnmhdr = (NMHDR*) lParam;
if (lpnmhdr->code == LVN_KEYDOWN)
{
LPNMLVKEYDOWN lpvkd = (NMLVKEYDOWN*) lParam;
switch (lpvkd->wVKey)
{
case 120: break;
case 121: break;
case 122: break;
case 123: break;
}
return TRUE;
}
else if (lpnmhdr->code == LVN_ITEMCHANGED)
{
}
else if (lpnmhdr->code == TVN_SELCHANGED)
{
}
break;
case NEW_LOG:
qItem = (QUEUE_ITEM*) lParam;
switch (wParam)
{
case LOG_DONE_A:
lstDoneA.push_back(*qItem); nDoneA++;
if (nDoneA > LOG_CACHE) {
for (i=0; i<LOG_CACHE/2; i++)
lstDoneA.pop_front();
}
if (Id > ELEM_DONE_A && Id <= ELEM_DONE_A+MAX_SEARCHDEPTH+1) fDisplay = TRUE;
break;
case LOG_DONE_P:
lstDoneP.push_back(*qItem); nDoneP++;
if (nDoneP > LOG_CACHE) {
for (i=0; i<LOG_CACHE/2; i++)
lstDoneP.pop_front();
}
if (Id > ELEM_DONE_P && Id <= ELEM_DONE_P+MAX_SEARCHDEPTH+1) fDisplay = TRUE;
break;
case LOG_QUEUED_A:
lstQueuedA.push_back(*qItem); nQueuedA++;
if (nQueuedA > LOG_CACHE) {
for (i=0; i<LOG_CACHE/2; i++)
lstQueuedA.pop_front();
}
if (Id > ELEM_QUEUED_A && Id <= ELEM_QUEUED_A+MAX_SEARCHDEPTH+1) fDisplay = TRUE;
break;
case LOG_QUEUED_P:
lstQueuedP.push_back(*qItem); nQueuedP++;
if (nQueuedP > LOG_CACHE) {
for (i=0; i<LOG_CACHE/2; i++)
lstQueuedP.pop_front();
}
if (Id > ELEM_QUEUED_P && Id <= ELEM_QUEUED_P+MAX_SEARCHDEPTH+1) fDisplay = TRUE;
break;
case LOG_FAILED_A:
lstFailedA.push_back(*qItem); nFailedA++;
if (nFailedA > LOG_CACHE) {
for (i=0; i<LOG_CACHE/2; i++)
lstFailedA.pop_front();
}
if (Id > ELEM_FAILED_A && Id <= ELEM_FAILED_A+MAX_SEARCHDEPTH+1) fDisplay = TRUE;
break;
case LOG_FAILED_P:
lstFailedP.push_back(*qItem); nFailedP++;
if (nFailedP > LOG_CACHE) {
for (i=0; i<LOG_CACHE/2; i++)
lstFailedP.pop_front();
}
if (Id > ELEM_FAILED_P && Id <= ELEM_FAILED_P+MAX_SEARCHDEPTH+1) fDisplay = TRUE;
break;
case LOG_FILTERED_A:
lstFilteredA.push_back(*qItem); nFilteredA++;
if (nFilteredA > LOG_CACHE) {
for (i=0; i<LOG_CACHE/2; i++)
lstFilteredA.pop_front();
}
if (Id > ELEM_FILTERED_A && Id <= ELEM_FILTERED_A+MAX_SEARCHDEPTH+1) fDisplay = TRUE;
break;
}
if (fDisplay)
{
// insert this item
}
free (qItem);
return TRUE;
case PDH_RUN:
pTV->update_text(ELEM_STATE, "Running");
ListView_DeleteAllItems(hLV);
return TRUE;
case PDH_STOP:
pTV->update_stat();
pTV->update_text(ELEM_STATE, "Stopped");
pTV->update_text(ELEM_SPEED, "Speed");
pTV->update_text(ELEM_ELAPSED, "Elapsed time");
lstDoneA.clear();
lstQueuedA.clear();
lstFailedA.clear();
lstFilteredA.clear();
lstDoneP.clear();
lstQueuedP.clear();
lstFailedP.clear();
lstFilteredP.clear();
nDoneA = nQueuedA = nFailedA = nFilteredA = 0;
nDoneP = nQueuedP = nFailedP = nFilteredP = 0;
Id = ELEM_DONE_A;
pQueue = pTV->get_queue_by_id(ELEM_DONE_A+1);
nPage = PageNum(pQueue);
iPage = 0;
if (nPage != 0)
{
iPage = nPage-1;
FillLV(pQueue, iPage, hLV);
}
return TRUE;
case WM_SIZE:
GetClientRect(hDlg, &rt);
SetWindowPos(hSel, 0, 0, 0, 200, 20, 0);
SetWindowPos(hTV, 0, 0, 20, 200, rt.bottom-20, 0);
SetWindowPos(hLV, 0, 200+1, 0, rt.right-200-1, rt.bottom, 0);
return TRUE;
case WM_DESTROY:
delete pTV;
pTV = NULL;
return TRUE;
}
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////////////////////
static unsigned int PageNum(Tqueue* pQueue)
{
int n = pQueue->count();
int nPage = n / PAGE_SIZE;
if (n % PAGE_SIZE != 0) nPage++;
return nPage;
}
static void FillLV (Tqueue* pQueue, unsigned int iPage, HWND hLV)
{
ListView_DeleteAllItems(hLV);
char path [MAX_PATH];
pQueue->get_src(path);
FILE* f = fopen(path, "rb");
if (f)
{
QUEUE_ITEM item;
int pos = 0;
fread (&pos, sizeof(pos), 1, f);
fseek (f, sizeof(pos) + pos*sizeof(item), SEEK_SET);
if (iPage != 0)
fseek (f, iPage*PAGE_SIZE*sizeof(item), SEEK_CUR);
int cRead = 0;
while (1)
{
memset(&item, 0, sizeof(item));
if (fread(&item, sizeof(item), 1, f) != 1) break;
// LVITEM lvi = {0};
// lvi.iItem = 0;
// lvi.mask = LVIF_TEXT;
// lvi.pszText = item.tm;
// ListView_InsertItem(hLV, &lvi);
cRead++;
if (cRead >= PAGE_SIZE) break;
}
fclose(f);
}
}