`

其他线程访问UI线程

    博客分类:
  • SWT
阅读更多
final ProgressBar pb = new ProgressBar(shell, SWT.NONE);
		pb.setBounds(68, 153, 365, 17);
		final int minnimum = pb.getMinimum();
		final int maximum = pb.getMaximum();
		Runnable r = new Runnable() {
		
			//线程运行的主体
			@Override
			public void run() {
				for(int i=minnimum;i<maximum;i++){
					try {
						//让线程睡眠0.1秒
						Thread.sleep(100);
					} catch (Exception e) {
						e.printStackTrace();
					}
//					pb.setSelection(pb.getSelection()+1); org.eclipse.swt.SWTException: Invalid thread access
					
					//让UI线程更新滚动条的值
					Display.getDefault().asyncExec(new Runnable() {
						
						//这也是一个线程,该线程的功能是更新滚动条的值,一瞬间就结束了
						//并且这个线程是被UI线程调用的
						@Override
						public void run() {
							if(pb.isDisposed())
								return;
								pb.setSelection(pb.getSelection()+1);
						}
					});
				}
			}
		
		};
		new Thread(r).start();
		
		//ps: 在设置滚动条的 progressBar 值时,为什么不能直接使用 pb.setSelection(pb.getSelection() + 1) 代码来直接设置滚动条的值呢?这时因为
		//滚动条对象是UI界面上的控件,它是由UI线程创建的.若要访问UI界面上的对象必须通过UI线程来访问,就是说在非UI线程中调用UI对象是不允许的,这时出于线程安全的考虑.
		//正因为如此,只能通过另一种方式来更新进度条的值,解决方案就是需要再开辟一个线程,专门更新滚动条的值,这个线程交给UI线程来调用.

 

分享到:
评论

相关推荐

    C# 跨线程访问UI线程控件

    C# 跨线程访问UI线程控件 在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误。    下面介绍两种解决方案  第一种:使用控件自带的Invoke或者...

    WPF后台线程更新UI

    - **线程安全问题**:由于.NET Framework的UI控件不支持多线程访问,后台线程直接修改UI会导致数据竞争和同步问题。 **2. Dispatcher的使用** - **Invoke方法**:后台线程可以通过调用`Dispatcher`的`Invoke`方法将...

    C# 线程更新UI界面

    这种方式下,UI线程不会被阻塞,可以在等待期间继续处理其他任务。 7. **总结** - 通过C#的委托和`Invoke/BeginInvoke`方法,我们可以在子线程中安全地更新UI,避免了线程同步问题和异常。 - 异步编程模型如`Task...

    C# 线程访问UI 代理Invoke技术 标准实现

    这就是所谓的“线程访问UI”。本篇将详细讲解如何利用代理和`Invoke`方法实现这一标准技术。 首先,我们需要理解Windows窗体应用程序(WinForms)或WPF中的控件都有一个关联的线程,称为UI线程。任何对UI控件的修改...

    用多线程更新UI

    当UI操作(如添加控件、改变文本或刷新界面)在一个单独的线程中执行时,可能导致界面卡顿或无响应,这是因为UI线程被阻塞,无法处理用户的其他交互。为了解决这个问题,我们通常会创建一个新的工作线程来执行耗时的...

    WinForm C# 多线程编程并更新界面(UI)

    这是因为控件的成员是线程相关的,其他线程访问它们可能会导致程序崩溃。 解决方案 为了解决这个问题,我们可以使用 `Invoke` 方法来更新界面。这是因为 `Invoke` 方法可以从任何线程中调用,并且它可以确保在 UI ...

    winForm 多线程操作UI

    1. 线程安全:当多个线程访问同一资源时,不会导致数据不一致或引发异常,称为线程安全。 2. 同步机制:Mutex、Semaphore、Monitor等工具用于控制线程对共享资源的访问,防止竞态条件和死锁。 七、注意事项 1. 避免...

    安卓UI线程机制 ,在子线程中访问UI

    下面将详细阐述Android UI线程的工作原理,以及如何在子线程中安全地访问UI。 一、Android UI线程 1. 主线程:每个Android应用都有一个主线程,它负责初始化Activity、BroadcastReceiver、Service等组件,并处理...

    Xamarin.Android 非UI线程更新UI

    - **线程同步**: 如果有多个线程可能同时访问UI,要确保使用适当的同步机制,如锁定或条件变量,以防止数据竞争。 总结起来,Xamarin.Android的非UI线程更新UI涉及了对Android线程模型的理解以及各种线程间通信技术...

    Winform实现多线程异步更新UI(进度及状态信息)

    3. **跨线程访问控件**:由于.NET Framework的安全机制,直接从非UI线程修改UI控件是不允许的。为了解决这个问题,可以使用控件的`Invoke`或`BeginInvoke`方法。这两个方法会在UI线程上执行传入的委托,从而安全地...

    qt编程_在子线程中更新UI界面

    5. **Qt的并发工具**:除了QThread,Qt还提供了其他并发工具,如QFuture、QRunnable和QtConcurrent,它们简化了多线程编程,可以自动处理线程安全和线程间通信。 6. **更新UI的正确方式**:使用`QObject::...

    VC 线程 创建 操作 同步 终止 UI线程等各种线程例子

    - 互斥量(Mutex)是一种同步对象,用于保护共享资源,一次只允许一个线程访问。`CreateMutex`函数用于创建互斥量,`WaitForSingleObject`或`WaitForMultipleObjects`函数用于线程等待获取互斥量。 3. **临界区...

    UI 线程 和 工作线程 的实现

    例如,当工作线程向UI线程发送消息时,可能需要一个临界区来防止并发访问进度变量。 7. **结束工作线程**:完成计算后,工作线程应通知UI线程并等待关闭。可以使用`PostThreadMessage()`发送WM_QUIT消息到工作线程...

    无界面的UI线程交互

    1. **创建后台线程**:首先,我们需要创建一个无界面的UI线程,它会在后台运行,执行计算或其他任务。 2. **定义数据交换接口**:为了使后台线程能与UI线程通信,我们需要定义一种方式来传递数据和控制信号。这可以...

    Winform中如何跨线程访问UI元素

    在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应, 同时我们又需要在工作线程中更新UI界面上的控件。但直接访问会出现“线程间操作无效”的情况,因为.NET禁止了跨线程调用控件, 否则...

    C#跨线程访问控件

    当我们需要在一个非UI线程中修改UI控件的状态时,就会遇到跨线程访问问题。由于Windows消息循环机制,控件只能在其创建的线程(主线程)上被安全地访问。这就是著名的“控制台不是创建它的线程”的错误。为了解决这...

    从不是创建控件“textBox1”的线程访问它.zip

    在.NET框架中,尤其是使用C#进行Windows Forms或WPF应用程序开发时,会遇到一个常见的错误:“线程间操作无效:从不是创建控件“textBox1”的线程访问它”。这个错误是由于线程同步问题引起的,特别是当尝试在非UI...

    c#多线程与ui响应

    2. **UI线程访问**:永远不要从非UI线程直接访问或修改UI控件。 3. **性能优化**:合理分配线程资源,避免不必要的线程创建和销毁,提高程序性能。 综上所述,C#中的多线程技术对于提升程序性能和用户体验具有重要...

    JAVA多线程的一个带UI界面的例子

    2. **线程安全**:如果多线程访问共享资源,必须确保线程安全,防止数据竞争和死锁。Java提供了`synchronized`关键字、volatile变量、ThreadLocal等机制来保证线程安全。 3. **线程通信**:在多线程环境下,线程间...

    跨线程访问控件实例.rar

    然而,当涉及到UI交互时,主线程(也称为UI线程)负责处理用户输入和更新UI,而其他线程则用于执行耗时的后台任务。 在.NET Framework中,为了保证UI的一致性和稳定性,Windows Forms和WPF都使用消息泵来处理用户...

Global site tag (gtag.js) - Google Analytics