19 12
发新话题
打印

多线程的终止问题,线程的动态资源如何释放

看来只能是stop, post stopped msg 方法了.

看来只能是stop, post stopped msg 方法了.

TOP

线程可以弄得这么深奥,阻塞、秒载、动态资源。。。。看不懂,用bool变量检测的飘过。。。

TOP

终止一个,没有必要等它完整终止了再返回的.
FLASHGET下载BT的时候,明明是停止了,关闭进程,但是进程还在,好几分钟才消失.
Search author named w1984721 ,You will be surprised.

TOP

向马甲1号学习:知道也不回答
超级简单易用的音视频转换组件 支持RMVB解码 FFmpeg for Delphi / VB http://www.CCAVC.com

TOP

给你个简单的方法好了,不要用别人的api,自己用socket去读。
检查socket有无数据,没有就休眠10毫秒,有就把它读出来,有多少读多少就完了。
下次我也想跟马甲一号学习了。。。
恨号,恨呛大!!!

TOP

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);
        }
}

TOP

............单纯的recv?你加个select或者别的模型的就可以马上响应了.
就算是单纯的,如果你closesocket的时候,它也可以马上响应的.
Search author named w1984721 ,You will be surprised.

TOP

你先检测一下到达的数据长度,没有就休眠,不就不会阻塞了?
恨号,恨呛大!!!

TOP

采用消息或会调吧,总感觉这样编代码很难看

采用消息或会调吧,总感觉这样编代码很难看

TOP

 19 12
发新话题