子執行緒更新UI

2021-09-06 20:10:44 字數 1256 閱讀 6646

一般在winform c/s程式中經常會在子執行緒中更新控制項的情況,桌面程式ui執行緒是主線程,當試圖從子執行緒直接修改控制項屬性時會出現「從不是建立控制項的執行緒訪問它」的異常提示。

跨執行緒更新ui控制項的常用方法有兩種:

1.使用控制項自身的invoke/begininvoke方法

2.使用synchronizationcontext的post/send方法更新

具體實現如下:

1.使用控制項自身的invoke/begininvoke方法

control類實現了isynchronizeinvoke 介面。

control類的invoke方法有兩個實現

object invoke(delegate); //在擁有此控制項的基礎視窗控制代碼的執行緒上執行指定的委託

object invoke(delegate,object );
可以看出繼承control類的ui控制項都可以使用invoke方法非同步更新。以下**段實現在子執行緒中更新label控制項的text屬性

private void button6_click(object sender, eventargs e)    

void threadmethod()

;//定義乙個委託

label1.invoke(asyncuidelegate,new object);

}

2.使用synchronizationcontext的post/send方法更新

synchronizationcontext類在system.threading命令空間下,可提供不帶同步的自由執行緒上下文,其中post方法簽名如下:

public virtual void post(sendorpostcallback d,object state) //將非同步訊息排程到乙個同步上下文

可以看出我們要非同步更新ui控制項,第一是要獲取ui執行緒的上下文了,第二就是呼叫post方法了,**實現:

synchronizationcontext _synccontext = null; 

private void button6_click(object sender, eventargs e)

//窗體建構函式

public form1()

private void threadmethod()

private void setlabeltext(object text)

Qt子執行緒如何更新UI?

和其他語言類似,不能直接在子執行緒更新ui,可以通過signal slot機制在ui執行緒進行更新。signal slot機制可以在不同物件,不同執行緒之間進行通訊。例子 include mainwindow.h include include class mythread public qthre...

android 子執行緒更新UI例項

package com.example.test0207 handler import android.os.bundle import android.os.handler import android.os.message import android.view.menu import andr...

Android之在子執行緒更新UI 一

方法一 用handler 1 主線程中定義handler handler mhandler new handler 2 子執行緒發訊息,通知handler完成ui更新 private void updateweather start 方法一的handler物件必須定義在主線程中,如果是多個類直接互相...