国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Application.DoEvents()

2019-11-14 16:51:24
字體:
來源:轉載
供稿:網友

今天,在按照書上的一個winform例子做練習(實則就是邊看邊抄了一遍...)的時候,看到application.DoEvents()這個方法,但是并不明白這個方法是做什么用的。只知道不用這個方法的話,在循環做耗時操作的時候,窗口ui繪制會出現問題。

于是在網上查找了一下,但是頭昏腦漲的,那些理論和概念對我來講,有點難懂。但是眼前我只是想理解這個方法的作用,于是便按照自己的理解去淺顯的給它作出解釋。

 PRivate void btnCopy_Click(object sender, EventArgs e)        {            List<FileInfo> fileList = GetFileList();            foreach (FileInfo file in fileList)            {                try                {                    labStatus.Text = "Copying " + txtTargetDir.Text + "//" + file.Name + "...";                    Application.DoEvents();                    //復制文件到目標位置                    file.CopyTo(txtTargetDir.Text + "//" + file.Name, chbOverWrite.Checked);                }                catch (Exception ex)                {                    MessageBox.Show(ex.Message);                }            }            labStatus.Text = "Done.";        }

上面的代碼是我做練習時候的其中一段,目的是點擊copy按鈕的時候,在名為labStatus的label上顯示一段文字,然后后臺就copy一個文件,如此循環,直到要copy的文件全部copy完成,最后將labStatus上的文字變成Done。

如此運行的話,是沒有什么問題的。但是我不太理解Application.DoEvents()方法在這里起了何種作用,于是將Application.DoEvents()注釋掉再運行。當我點擊copy之后,窗口像是“死掉”了一樣,但是后臺的文件確實是正在復制,復制完成之后,labStatus的text變成done。

在我查找資料的過程中,我才知道windows的消息機制。但是那些深入的理論,對于我目前來說有點看著頭疼,看了也看不懂,又不會去用,看了也會忘記的。于是我淺顯的了解了一點目前需要的。

以下看起來比較書面的文字,是我抄錄來的。

1,消息,就是指Windows發出的一個通知,告訴應用程序某個事情發生了。例如,單擊鼠標、改變窗口尺寸、按下鍵盤上的一個鍵都會使Windows發送一個消息給應用程序。

2,Windows的消息系統是由3個部分組成的:

 

  ·消息隊列。Windows能夠為所有的應用程序維護一個消息隊列。應用程序必須從消息隊列中獲取消息,然后分派給某個窗口。

 

  ·消息循環。通過這個循環機制應用程序從消息隊列中檢索消息,再把它分派給適當的窗口,然后繼續從消息隊列中檢索下一條消息,再分派給適當的窗口,依次進行。

 

  ·窗口過程。每個窗口都有一個窗口過程來接收傳遞給窗口的消息,它的任務就是獲取消息然后響應它。窗口過程是一個回調函數;處理了一個消息后,它通常要返回一個值給Windows。

3,一個消息從產生到被一個窗口響應,其中有5個步驟:

  1) 系統中發生了某個事件。

  2) Windows把這個事件翻譯為消息,然后把它放到消息隊列中。

  3)應用程序從消息隊列中接收到這個消息,把它存放在TMsg記錄中。

  4)應用程序把消息傳遞給一個適當的窗口的窗口過程。

  5) 窗口過程響應這個消息并進行處理。

  步驟3和4構成了應用程序的消息循環。消息循環往往是Windows應用程序的核心,因為消息循環使一個應用程序能夠響應外部的事件。消息循環的任務就是從消息隊列中檢索消息,然后把消息傳遞給適當的窗口。如果消息隊列中沒有消息,Windows就允許其他應用程序處理它們的消息。

到這里也就差不多了,其他的資料看了也沒看,大概能看懂的也記不住,就不提了。那么回到原本的話題上來,Application.DoEvents()方法在這里起了什么作用?

我的比較淺顯的理解是,在上面那段代碼里,當我們點擊copy按鈕之后,在循環中,每一次windows都往當前消息隊列里添加了兩個消息,一個是labStatus的text要改變,另一個是要copy一個文件,然而copy一個文件很明顯是比較耗時的操作。在我注釋掉Application.DoEvents()這行代碼之后,從運行的窗口展現出來的效果來看,很顯然,它是先將copy文件的那個消息響應了,然后在所有的copy文件操作都執行完了之后,再去響應了labStatus的text改變操作,但是一次性執行循環里的所有labStatus的text改變操作的話,我們就只能看得見最后的 labStatus.Text = "Done.";所產生的效果了。當然,在copy過程中,我們要去點擊窗口,或者拖動窗口,這些操作是要等到copy之后的。

所以,Application.DoEvents()方法所做的事情,正如它的介紹一樣——處理當前在消息隊列里的所有windows消息。

但是我還是有很多很多不明白的地方,比如為什么是先響應了copy操作呢?這個隊列是怎么排列的呀?不過現在暫且就這樣了。以上就是我的個人的理解,它或許根本就是錯誤的,或許有許多很幼稚的地方,請看到的朋友們告訴我,幫助我的學習,也順便鞏固下您自己。謝謝!

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 柳河县| 浠水县| 汉中市| 池州市| 抚顺市| 罗源县| 苏尼特左旗| 郎溪县| 山东省| 安塞县| 昌吉市| 新和县| 长治市| 长治县| 桂平市| 扶沟县| 芦溪县| 北宁市| 河西区| 封开县| 特克斯县| 周口市| 河津市| 湘阴县| 阆中市| 靖宇县| 阿拉善右旗| 从化市| 当阳市| 西平县| 柳林县| 璧山县| 新沂市| 霍州市| 凤翔县| 广丰县| 罗山县| 闵行区| 江西省| 开封县| 正定县|