為什麼我的Thread會停掉... |
尚未結案
|
jackyeh1021
一般會員 發表:7 回覆:13 積分:4 註冊:2004-03-16 發送簡訊給我 |
各位先進大家好: 我現在在寫一個網路攝影機的DIO偵測程式,為了要即時反映所以我採用了Thread的做法,可是每次都會跑一陣子就停止(時間不再跳動),反覆查了很久實在看不出來問題所在,各位大大可不可以幫幫忙,
void __fastcall HTTPThread::Execute() { m_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); http=new TNMHTTP(MyMSForm); AnsiString strURL; char szURL[128]; wsprintf(szURL,"http://10.144.111.2/axis-cgi/io/input.cgi?check=1"); http->HeaderInfo->UserId = "root"; http->HeaderInfo->Password = "pass"; char ss[64]; m_WaitTime = 500; while(1) { if ( WaitForSingleObject(m_hEvent,m_WaitTime/*INFINITE*/) == WAIT_TIMEOUT ) { try{ http->Get(szURL); } catch(Exception &e) { MyMSForm->StringGrid2->Cells[1][2] = TimeToStr(Time()); MyMSForm->StringGrid2->Cells[2][2] = "-1"; m_WaitTime=3000; continue; } char xx[64]; int ii1,ii2=0; sscanf(http->Body.c_str(),"input%d=%d",&ii1,&ii2); iii ; if(ii2==1) { MyMSForm->StringGrid2->Cells[1][2] = TimeToStr(Time()); MyMSForm->StringGrid2->Cells[2][2] = "1"; iii=0; m_WaitTime=5000; continue; } if(iii>2) { MyMSForm->StringGrid2->Cells[1][2] = TimeToStr(Time()); MyMSForm->StringGrid2->Cells[2][2] = "0"; iii=0; } m_WaitTime=500; } else break; } if(http!=NULL) delete http; MyMSForm->StringGrid2->Cells[1][2] = TimeToStr(Time()); MyMSForm->StringGrid2->Cells[2][2] = "999"; }發表人 - jackyeh1021 於 2005/03/02 15:00:33 發表人 - jackyeh1021 於 2005/03/02 15:23:52 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
您好:
PO程式碼的方式請參考版歸說明
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48259 煩請修改,謝謝您的配合< > 順心< >
|
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
jackyeh1021
一般會員 發表:7 回覆:13 積分:4 註冊:2004-03-16 發送簡訊給我 |
|
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
引言: 如果所有的thread都沒有去處理這個位置的資料,這樣也會有問題嗎? 我認為各自獨立各別的VCL,應該沒問題吧!!!你的觀念,錯得非常厲害喔 Microsoft 規定,除了在主THREAD,其他THREAD不可以『直接』操作畫面上的控制項,特別是可視元件,如果要操作你可以用Synchronize切回主THREAD操作,或是用SendMessage or PostMessage 真的建議你,先去找本MULTI THREAD的書來看,以免越寫越錯,最後連程式當在哪裡都不知 不然在K.TOP上面搜尋一下,站內有粉多相關的討論 ========================= 大家一起快樂寫程式 |
jackyeh1021
一般會員 發表:7 回覆:13 積分:4 註冊:2004-03-16 發送簡訊給我 |
感謝lu兄的指教,我也照pwipwi兄的建議看完相關的資料,
所以我已經將程式修正為以下寫法,可是還是會停止耶!!
我是不是還有地方沒考慮到....
void __fastcall HTTPThread::Execute() { m_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); http=new TNMHTTP(MyMSForm); AnsiString strURL; char szURL[128]; wsprintf(szURL,"http://10.144.111.2/axis-cgi/io/input.cgi?check=1"); http->HeaderInfo->UserId = "root"; http->HeaderInfo->Password = "pass"; char ss[64]; m_WaitTime = 500; while(1) { if ( WaitForSingleObject(m_hEvent,m_WaitTime/*INFINITE*/) == WAIT_TIMEOUT ) { try{ http->Get(szURL); } catch(Exception &e) { m_strShow = "-1"; Synchronize(ShowGrid); m_WaitTime=3000; continue; } char xx[64]; int ii1,ii2=0; sscanf(http->Body.c_str(),"input%d=%d",&ii1,&ii2); iii ; if(ii2==1) { m_strShow = "1"; Synchronize(ShowGrid); iii=0; m_WaitTime=5000; continue; } if(iii>2) { m_strShow = "0"; Synchronize(ShowGrid); iii=0; } m_WaitTime=500; } else break; } if(http!=NULL) delete http; m_strShow = "999"; Synchronize(ShowGrid); } void __fastcall HTTPThread::ShowGrid() { MyMSForm->StringGrid2->Cells[1][2] = TimeToStr(Time()); MyMSForm->StringGrid2->Cells[2][2] = m_strShow; }發表人 - jackyeh1021 於 2005/03/02 20:40:19 |
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
jackyeh1021
一般會員 發表:7 回覆:13 積分:4 註冊:2004-03-16 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
jackyeh1021
一般會員 發表:7 回覆:13 積分:4 註冊:2004-03-16 發送簡訊給我 |
我已經將Code改為這樣
void __fastcall HTTPThread::Execute() { m_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); http=new TNMHTTP(MyMSForm); AnsiString strURL; char szURL[128]; wsprintf(szURL,"http://10.144.111.2/axis-cgi/io/input.cgi?check=1"); m_WaitTime = 500; while(1) { if ( WaitForSingleObject(m_hEvent,m_WaitTime/*INFINITE*/) == WAIT_TIMEOUT ) { try{ m_strShow = "before"; Synchronize(ShowGrid); http->Get(szURL); m_strShow = "after"; Synchronize(ShowGrid); } catch(Exception &e) { m_strShow = "-1"; Synchronize(ShowGrid); m_WaitTime=3000; continue; } int ii1,ii2=0; sscanf(http->Body.c_str(),"input%d=%d",&ii1,&ii2); if(ii2==1) { m_strShow = "1"; Synchronize(ShowGrid); m_WaitTime=5000; continue; } m_strShow = "0"; Synchronize(ShowGrid); m_WaitTime=500; } else break; } if(http!=NULL) delete http; m_strShow = "999"; Synchronize(ShowGrid); } void __fastcall HTTPThread::ShowGrid() { MyMSForm->StringGrid2->Cells[1][2] = TimeToStr(Time()); MyMSForm->StringGrid2->Cells[2][2] = m_strShow; }我在http->Get(szURL);的前後設定顯示字串, 最後發現程式執行一陣子,所有的cell都顯示在before 就不動了... 所以我判斷是 TNMHTTP的問題 |
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
|
lu
高階會員 發表:11 回覆:189 積分:195 註冊:2003-11-19 發送簡訊給我 |
|
jackyeh1021
一般會員 發表:7 回覆:13 積分:4 註冊:2004-03-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |