doevents的python的簡單介紹

本文目錄一覽:

請問VB中的Doevents有什麼用?

DoEvents的作用是轉讓控制權給系統。比如在執行十萬次的加法減法運算時,如果不轉讓控制權,程序看起來就像死了一樣,你也不能做任何事直到它結束。轉讓控制權以後,系統可以做別的事情。

在VB語言中,DOEVENTS的具體的用法和含義是什麼

DoEvents的應用及注意事項

轉讓控制權,以便讓操作系統處理其它的事件。

DoEvents 函數會返回一個 Integer,以代表 Visual Basic 獨立版本中打開的窗體數目,例如,Visual Basic,專業版,在其它的應用程序中,DoEvents 返回 0。

DoEvents 會將控制權傳給操作系統。當操作系統處理完隊列中的事件,並且在 SendKeys 隊列中的所有鍵也都已送出之後,返回控制權。

DoEvents 對於簡化諸如允許用戶取消一個已啟動的過程 — 例如搜尋一個文件 — 特別有用。對於長時間過程,放棄控制權最好使用定時器或通過委派任務給 ActiveX EXE 部件來完成。以後,任務還是完全獨立於應用程序,多任務及時間片由操作系統來處理。

小心 確保以 DoEvents 放棄控制權的過程,在第一次 DoEvents 返回之前,不能再次被其他部分的代碼調用;否則會產生不可預料的結果。此外,如果其它的應用程序可能會和本過程以不可預知的方式進行交互操作,那麼也不要使用 DoEvents,因為此時不能放棄控制權。

使用 DoEvents

儘管 Timer 事件是後台處理的最好工具,對耗時極多的任務,情況更是如此,但是,DoEvents 函數還是提供了一種取消任務的簡便方法。例如,下列代碼將顯示一個 “Process” 按鈕,單擊這個按鈕時,它將變成 “Cancel” 按鈕。再次單擊按鈕又將中斷正在執行的任務。

‘此按鈕標題是 “Process”

Private Sub Command1_Click()

‘過程的所有實例都共享靜態變量。

Static blnProcessing As Boolean

Dim lngCt As Long

Dim intYieldCt As Integer

Dim dblDummy As Double

‘按下按鈕時,檢測是否在處理

If blnProcessing Then

‘如果正在處理,則取消

blnProcessing = False

Else

Command1.Caption = “Cancel”

blnProcessing = True

lngCt = 0

‘執行一百萬次浮點乘法計算。每一千次後,檢測是否要取消。

Do While blnProcessing And (lngCt 1000000)

For intYieldCt = 1 To 1000

lngCt = lngCt + 1

dblDummy = lngCt * 3.14159

Next intYieldCt

‘DoEvents 語句允許其它事件發生,包括第二次按此按鈕。

DoEvents

Loop

blnProcessing = False

Command1.Caption = “Process”

MsgBox lngCt ” multiplications were performed”

End If

End Sub

DoEvents 將控制切換到操作環境內核。只要此環境中的所有應用程序都有機會響應待處理事件,應用程序就又恢復控制。這不會使應用程序放棄焦點,但會使後台事件能夠得到處理。

這種妥協的結果可能並不總是達到預期目標。例如,下述 Click 事件代碼在單擊按鈕後要一直等候十秒鐘,而後才顯示一條信息。如果在按鈕正在等待期間單擊它,則將以相反順序完成單擊操作。

Private Sub Command2_Click()

Static intClick As Integer

Dim intClickNumber As Integer

Dim dblEndTime As Double

‘每次單擊按鈕時

‘賦予唯一數值。

intClick = intClick + 1

intClickNumber = intClick

‘等待十秒。

dblEndTime = Timer + 10#

Do While dblEndTime Timer

‘不做任何事情,僅僅允許

‘其它應用程序處理

‘它們的事件。

DoEvents

Loop

MsgBox “Click ” intClickNumber ” is finished”

End Sub

對於通過 DoEvents 放棄控制的事件過程,有時可能希望防止在 DoEvents 返回之前重新調用這一過程。否則將無窮無盡地調用該過程,直到系統資源消耗殆盡。可暫時禁止控件,或象上例一樣,使用一個靜態的“標誌”變量防止此事發生。

在使用全局數據時避免 DoEvents

當一個函數已通過 DoEvents 放棄控制時,可相當安全地再次調用函數。例如,下一過程將檢測質數並用 DoEvents 語句周期地啟動其它應用程序處理事件:

Function PrimeStatus (TestVal As Long) As Integer

Dim Lim As Integer

PrimeStatus = True

Lim = Sqr(TestVal)

For I = 2 To Lim

If TestVal Mod I = 0 Then

PrimeStatus = False

Exit For

End If

If I Mod 200 = 0 Then DoEvents

Next I

End Function

該代碼中每重複 200 次就調用一次 DoEvents 語句。這樣一來,當該環境的其餘部分對事件作出響應時,只要有必要,PrimeStatus 過程就可繼續計算。

考慮在調用 DoEvents 期間發生的事情。在其它窗體和應用程序處理事件時將暫停執行應用程序代碼。這些事件之一有可能是一個按鈕單擊操作,它將再次啟動 PrimeStatus 過程。

這將導致重新進入 PrimeStatus 過程的,但是,因為在函數每次出現時,堆棧都為其參數和局部變量分配了空間,所以重入不會引發衝突。當然,如果過多調用 PrimeStatus,則可能出現“溢出堆棧空間”錯誤。

如果 PrimeStatus 使用或改變模塊級變量或全局數據,情況就會完全不同。此時,在 DoEvents 能夠返回之前執行 PrimeStatus 的另一個實例,這將導致模塊數據或全局數據的值完全不同於它們在調用 DoEvents 之前的值。於是,PrimeStatus 的結果將會難以預料。

VB中DoEvents的注意事項

對與再大循環里 加入 DoEvents卻是可以使應用程序響應其他程序,但是 DoEvents也會很大程度上影響循環的速度,所以一般情況我這樣用

If GetInputState Then DoEvents

雖然多了個判斷語句,但速度上確快了很多

比較以下代碼代碼就知道了速度的差別

Private Declare Function GetInputState Lib “user32” () As Long

Private Declare Function GetTickCount Lib “kernel32” () As Long

Private Sub Command1_Click()

Dim s As Long

s = GetTickCount

For i = 1 To 1000000

DoEvents

Next

MsgBox GetTickCount – s

End Sub

Private Sub Command2_Click()

Dim s As Long

s = GetTickCount

For i = 1 To 1000000

If GetInputState Then DoEvents

Next

MsgBox GetTickCount – s

End Sub

PYTHON tkinter編程,請懂的人幫忙:

界面設計有一個基本原則,同樣適用於tkinter,也就是說界面是單線程的。所以界面的所有事件,如果特別是耗時,不能幾毫秒解決。就需要交給後台線程去做。後台線程做完了後就將結果放在一個變量里,再通常消息通知界面刷新。這樣界面就不會卡住了。

doevents的原理是。強制停下當前線程,然後處處理一下窗口消息隊列里的事件。不過有時候這個方法並不靈,也會出現界面卡死。

所以你綁定了事件,然後觸發成功,也執行了。不過你執行的這段代碼一直在循環運行,沒有很快退出,這樣界面當然就沒有辦法刷新了。

你可以啟動一個線程去做你的那件事情。

VB 中DoEvents和RaiseEvent的用法是什麼?

1)DoEvents的目的是把控制權讓出一會兒,以便線程能響應一下菜單或鍵盤事件。比如你的一個不可見線程正在處理一個很大的循環,每次循環後都要調用一下DoEvents,否則你的程序看起來就向掛起無響應一樣。

2)RaiseEvent是觸發一個事件,這樣就可以執行事件回調函數中的代碼,這個通常用在控件編程中。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/244428.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:02
下一篇 2024-12-12 13:02

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論