在winform的主視窗Form1中有一個定時器定時更新Form1的控制元件,同時在主界面點擊按鈕后通過模式視窗顯示另一個表單Form2,在Form2下同樣有一個定時器更新Form2界面上的控制元件。發現在模式視窗Form2顯示的時候,Form1上的控制元件同樣在更新。
Form1的代碼如下:System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
int ii = 0;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string mmm = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
timer.Interval = 1000;
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
ii++;
textBox1.Text = ii.ToString() + "\t Thread=" + Thread.CurrentThread.ManagedThreadId.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
DialogResult dialogResult= form2.ShowDialog();
if (dialogResult==DialogResult.OK)
{
form2.Dispose();
}
}
Form2的代碼與Form1的代碼基本上是一樣的,除了Form2不顯示模式視窗。
我奇怪的是當在Form1中點擊按鈕時,UI執行緒是停在DialogResult dialogResult= form2.ShowDialog()中的,看到介紹說當使用ShowDialog時,會創建一個內部的訊息回圈,我想問的是主視窗Form1中的控制元件更新也是在內部的訊息回圈中完成的嗎,而不是在Form1自身的外部訊息回圈中完成的?
uj5u.com熱心網友回復:
模態訊息泵(訊息回圈)也要派送和處理訊息,如codeproject的貼子示范的,定時器訊息,也會得到派送處理。(https://www.codeproject.com/Articles/348/Implementing-Modal-Message-Loops)
BOOL fDone;
INT nResult;
int RunModalWindow(
HWND hwndDialog,
HWND hwndParent)
{
if(hwndParent != NULL)
EnableWindow(hwndParent,FALSE);
MSG msg;
for(fDone=FALSE;fDone;WaitMessage())
{
while(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
{
fDone = TRUE;
PostMessage(NULL,WM_QUIT,0,0);
break;
}
if(!IsDialogMessage(hwndDlg,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
if(hwndParent != NULL)
EnableWindow(hwndParent,TRUE);
DestroyWindow(hwndDialog);
return nResult;
}
uj5u.com熱心網友回復:
winform的timer和Thread的timer的區別就在這里,用thread的timer是不能直接更新界面,
而用winform的timer都不用invoke之類的
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/70711.html
標籤:C#
