可以Application.DoEvents()
在C#中使用吗?
这个函数是否能够让GUI跟上应用程序的其余部分,就像VB6 DoEvents
一样?
简单的搜索DoEvents
会带来很多结果,这些结果基本上会导致:
DoEvents
是邪恶的.不要使用它.请改用线程.
一般引用的原因是:
但是一些值得注意的Win32功能,例如TrackPopupMenu
并DoDragDrop
执行自己的消息处理以保持UI响应,就像这样DoEvents
.
然而,这些问题似乎都没有遇到过这些问题(性能,再入等等).
他们是如何做到的呢?他们如何避免引用的问题DoEvents
?(或者做他们?)
"DoEvents"在vb6中做了什么?为什么我收到错误消息"堆栈空间不足"?这是什么意思 ?
从MSDN,似乎Application.DoEvents()在Windows.Forms中可用.什么是WPF中的等价物.
什么是使用的必要性Application.DoEvents
以及什么时候应该使用它?
建立:
问题描述
使用任何技术的任意组合后,等待Power Query完成刷新,如下面所示的"我尝试过的东西:"部分所述.根据"查询和连接"窗格中显示的刷新指示器(微调器?)图标,可以在Power Query表完成更新之前显示消息框并执行任何其他代码.
上述语句的例外是Application类的"OnTime"方法,如下面的"代码"部分所示,它似乎不会中断电源查询刷新的轮询.但是,此方法的问题在于它使用硬编码的时间来暂停VBA代码,并且这并不总是有效,因为查询的数据的大小,数量和持续时间将随时间而变化.
我尝试过的事情:
码:
Private Sub sht_sub_Refresh_AllConnections_dev()
'Name: sht_sub_Refresh_AllConnections_dev
'Purpose: An attempt at using VBA to wait for Queries to finish updating before displaying a message.
'Description: Waits for a hard coded period of time before dislpaying the message box.
'State: WIP.
'Dev: Needs a way to look at …
Run Code Online (Sandbox Code Playgroud) 是Application.DoEvents()
只是形式?
我认为这个命令用于确保之前的所有命令都被处理,但现在在阅读文档后,我不再确定了.
我有一个主要的STA线程,它调用COM对象上的很多方法,以及一个辅助STA线程,它也在同一个对象上做了很多工作.我希望主线程和辅助线程并行工作(即我希望主要和次要的隔行扫描输出).我知道我需要时不时地在主线程中抽取消息 - 在C++中调用Get/Translate/DispatchMessage就可以了.
但是我遇到了在C#中使用相同策略的问题.起初我在主线程中使用CurrentThread.Join()来控制第二个线程.它没用.然后我转向Application.DoEvents() - 每当我想要第二个线程运行时,我在主线程中调用它.结果是第二个线程快速抓取控件并且不会松开 - 主线程无法继续直到第二个线程全部完成.
我阅读的文档说Application.DoEvents()将处理所有等待事件 - 而GetMessage()只检索一条消息.
什么是正确的做法?是否有C#等价的Get/Translate/DispatchMessage?
谢谢
更新:第二个线程运行得太快,向主STA线程发送大量COM调用消息.我刚刚在第二个线程中添加了延迟以减慢速度.现在两个线程基本上并行运行.但我仍然想知道是否存在与G#等效的GetMessage/TranslateMessage/DispatchMessage.
我有一组包含以下内容的代码:
Application.Wait (Now + TimeValue("4:00:00"))
Run Code Online (Sandbox Code Playgroud)
这实际上暂停了从凌晨3点(当它完成运行代码时)到上午7点(应该恢复时)的四小时窗口的宏.代码基本上是无限循环.
我希望用户能够在此期间控制编辑某些单元格.我试过了
DoEvents
Run Code Online (Sandbox Code Playgroud)
但是还没有找到保持宏运行的方法,但是在宏除了等待之外什么都不做的时候,还为用户提供了控制权.
任何见解将不胜感激.谢谢!
编辑:
还有一个后续问题.我创建了这个宏来引用实际的宏"Production_Board".我希望这个宏一直运行并尽可能频繁地刷新.通过使用goto startagain,它会尝试在宏开始之前再次启动宏,因为"ontime"延迟间隔.
我怎么能让子RunMacro再次启动宏"Production_Board"完成的第二个?
Sub RunMacro
startagain:
Dim hour As Integer
Dim OT As String
hour = 0
OT = "Empty"
hour = Sheets("Calculations").Range("DR1").Value
OT = Sheets("Black").Range("D4").Value
If OT = "Y" Then
If hour = 3 Or hour = 4 Then
Application.OnTime TimeValue("05:00:00"), "Aespire_Production_Board"
Else
Application.OnTime Now + TimeValue("00:00:30"), "Aespire_Production_Board"
End If
Else
If hour = 3 Or hour = 4 Or hour = 5 Or hour = 6 Then …
Run Code Online (Sandbox Code Playgroud) 在VBA中,您可以Call
在它们之前调用您的方法/函数,以明确告诉编译器您不希望使用返回值(如果有).
现在也可以调用DoEvents函数Call
,但我无法实现.
当我输入:
Call DoEvents
Run Code Online (Sandbox Code Playgroud)
它只是在编译时说"语法错误".
为什么我不能使用Call
面前的DoEvents
?
在Excel 2016中使用VBE中的VBA,IIRC在2013年,2010年等也没有工作.