我開發了一個C#應用程序來讀取來自GSM調制解調器的呼叫。我使用定時器定期讀取端口,並在有來電時通知我。兩個timer_tick事件不可能在讀取相同數據但並行執行不同任務時並行工作?
現在我正在嘗試使用另一個定時器,它會寫入AT + CSQ - 要知道信號質量,請在端口上讀取端口的質量值。在兩個定時器中,我使用正則表達式來匹配和分離我需要的數據。現在的問題是,只有我的定時器2這是讀取信號質量只是工作,但不是計時器讀取來電。
定時器讀信號強度:
private void tmr_sig_quality_Tick(object sender, EventArgs e)
{
if (port.IsOpen)
{
port.WriteLine("AT+CSQ");
string s= port.ReadExisting();
var match= Regex.Match(s,@"\+CSQ: (\d+),(\d+)");
if (match.Success)
{
progressBar1.Value = int.Parse(match.Groups[1].Value);
}
}
}
定時讀取來電:
private void timer1_Tick(object sender, EventArgs e)
{
s = port.ReadExisting();
var match = Regex.Match(s, "RING[^\\+]*\\+CLIP:\\s*\"(?<phone>[^\"]*)\",(\\d+),\"([^\"]*)\",(\\w*),\"(\\w*)\",(\\w*)");
if (match.Success && s.Contains("RING"))
{
incall_status.Text = "Incoming Call...." + match.Groups["phone"].Value;
incall_status.Visible = true;
}
}
爲什麼發生這種情況和解決方案嗎?
爲什麼你沒有在一個單一的計時器呼叫? – Gavin 2012-07-30 12:27:07
我在這裏有一個典型的問題。我這樣做,但我的進度條沒有顯示任何東西。我使用斷點來查看我的字符串已經閱讀了什麼,並且我驚訝地發現它正確地閱讀,並且我的進度條顯示了狀態。但是當我直接運行我的應用程序時,進度條不顯示任何內容。 – Cdeez 2012-07-30 12:43:50
你會發現你不能通過線程來改變UI。如果我沒有記錯,定時器使用線程,所以你需要使用Invoke,即http:// stackoverflow。COM /問題/ 661561 /如何對更新 - 桂 - 從-另一個線程在-C – Gavin 2012-07-30 12:52:30