2015-08-26 29 views
0

從條形碼掃描儀獲取一些數據後嘗試打開新窗體時遇到問題。這個想法是通過打開serialPort和使用DataReceived事件讀取數據的Main窗體。當那一刻發生時,我想打開新窗體並將其傳遞給它。 (理想狀態是通過的SerialPort所以這將是手術有太多)從串口獲取數據後打開新窗體

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 

     string barcode = serialPort1.ReadExisting(); 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new SetCallBack(SetText), new object[] { barcode }); 
     } 

    } 
    delegate void SetCallBack(string text); 
    private void SetText(string text) 
    { 
      Form2 frm = new Form2(text, serialPort1); 
      frm.ShowDialog(); 
      serialPort1.DiscardInBuffer(); 
    } 

它工作正常,一次或兩次,但該控件凍結後。當我更改代碼到

frm.Show(); 

它工作沒有問題(或至少它們不可見)。 .ShowDialog()會導致死鎖嗎?

//注意,我也取從數據庫中一些數據是這裏沒有顯示,但它也可能引起問題的

有人建議我不要用DataReceive事件的而不是建立一個定時器(〜 250ms)並檢查ByteToRead屬性,但我遇到了同樣的問題。

我也會堅持使用Form.Show()的工作版本,但不幸的是我需要那個對話框是模態的。

如果你有什麼想法可能會問題,我會很高興。 提前謝謝!

+0

你關閉窗體,掃描條形碼,關閉窗體,掃描另一條碼,關閉窗體並最終停止工作?或者當表單已經打開時你是否掃描條形碼? – Matt

+0

@Matt運行應用程序,掃描條形碼 - >第二種形式打開。關閉第二張表格,掃描新的條形碼,打開第二張表格,關閉它並掃描新的條形碼。 – Aldoras

+0

這真的很奇怪!我剛剛創建了一個簡單的WinForms應用程序,並用ShowDialog打開並關閉了一個窗體,沒有任何問題。你可以在SetText中包裝一切,看看是否有異常被拋出? – Matt

回答

0

調用顯示對話框後,最終顯示對話框結果。此對話結果會阻止您創建另一個對話框,直到您處理它(如解釋here)。

您應該手動配置它或將對話框中的呼叫使用呼叫

private void SetText(string text) 
     { 
       using (Form2 frm = new Form2(text, serialPort1)) 
       { 
         frm.ShowDialog(); 
       } 
       serialPort1.DiscardInBuffer(); 
     } 

private void SetText(string text) 
    { 
      Form2 frm = new Form2(text, serialPort1); 
      frm.ShowDialog(); 
      frm.Dispose(); 
      serialPort1.DiscardInBuffer(); 
    } 

我認爲GC是應該爲你做這個時,對話框不用過了。但我不確定在調用時有多好。

編輯 有點賭博的,但試試這個:

private object mScanLock = new object(); 
private void SetText(string text) 
     { 
      lock(mScanLock) { 
       Form2 frm = new Form2(text, serialPort1); 
       frm.ShowDialog(); 
       frm.Dispose(); 
       serialPort1.DiscardInBuffer(); 
       } 
     } 
+0

添加了frm.Dispose();但是在第二次打開後它仍然凍結,或者如果我快速關閉Form2並掃描新的條形碼,它仍然會凍結 – Aldoras

+0

您是否必須手動關閉第二個屏幕,或者在代碼已完成運行時關閉第二個屏幕? –

+0

我正在手動關閉它。通過點擊一些按鈕,或者我自己的一些按鈕做一些動作,然後調用this.Dispose();所有這些選項導致相同的問題 – Aldoras

0

由於您在Form2中使用串口,​​可能會出現某種死鎖。 你可以舉一個例子,你在你的Form中使用serialPort1做什麼? 事實上,你的表格凍結有時也是一個很好的跡象。

如果您有可能請將您需要的數據交給第二個表格。

Form2 frm = new Form2(text); 

如果這是不可能的,你必須檢查所有的方法是否都是線程安全的。 (=>https://en.wikipedia.org/wiki/Thread_safety

+0

在這一刻,我只是將它傳遞給構造函數,沒有更多。在Form2中使用該串口的所有代碼都會被註釋掉。 – Aldoras