iOS 安全地在主线程执行一个Block】的更多相关文章

//主线程同步队列 #define dispatch_main_sync_safe(block)\ if ([NSThread isMainThread]) {\ block();\ } else {\ dispatch_sync(dispatch_get_main_queue(), block);\ } //主线程异步队列 #define dispatch_main_async_safe(block)\ if ([NSThread isMainThread]) {\ block();\ } e…
为什么一定要在主线程刷新UI? 安全+效率:因为UIKit框架不是线程安全的框架,当在多个线程进行UI操作,有可能出现资源抢夺,导致问题. 其实:在子线程是不能更新UI的, 看到能更新的结果只是个假象.因为:在子线程代码完成之后,回到主线程,然后执行了子线程的更新UI的代码,由于这个时间很短,所以看起来是能够在子线程刷新UI的.想验证的话也很简单,看下面demo:点击按钮,会开启一个子线程,然后在子线程中刷新该按钮的标题,再新建一个按钮,最后一行代码是延迟5秒. - (void)viewDidL…
考虑这样一种需求,使用Qt的线程类QThread在后台执行操作(比如说拷贝文件)的时候发生了错误,产生了一个错误信息需要提醒给用户,在后台输出很显然是不够的,因为用户可能根据就没有任何控制台可供程序输出信息. 这是本人自己做得一个仿Win10文件拷贝对话框的一个文件拷贝对话框 该问题纠结到根本是因为Qt的任何窗口代码都必须在主线程(也就是main函数所在的那个线程)中执行.如果在后台发生错误需要出对话框提示给用户的话,必须能够将后台信息阻塞性的发送给前台,在前台图形类的程序执行完毕后再返回. 那…
/** 在主线程执行block */ + (void)gs_synExecuteOnMainThread:(void (^)(void))block { if ((nil == block) || (NULL == block)) { return; } if ([NSThread isMainThread]) { block(); }else { dispatch_sync(dispatch_get_main_queue(), ^{ block(); }); } } /** 在异步主线程执行b…
一.join() Thread中的join()方法就是同步,它使得线程之间由并行执行变为串行执行. public class MyJoinTest { public static void main(String[] args) { Vector<Thread> threadVector = new Vector<Thread>(); for (int i = 0;i<5;i++){ Thread childThread = new Thread(new Runnable()…
很多人都对Handler的机制有所了解,如果不是很熟悉的可以看看我 如果看过源码的人都知道,在处理消息的时候使用了Looper.loop()方法,并且在该方法中进入了一个死循环,同时Looper.loop()方法是在主线程中调用的,那么为什么没有造成阻塞呢? 首先我们需要从Android程序启动的入口开始来看:  如果不清楚Android的应用启动详细流程的可以看看这个 然后再看看Looper.loop()方法: public static final void loop() { Looper…
我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但在这之前,我们还需要认识一下线程的一些基本特性,它们的出现并不是多余的,而是为了解决一部分问题出现的,毕竟存在即合理,我们先说主线程.前台线程和后台线程: 一.主线程.前台线程与后台线程 相信前几年,大家都用过迅雷,用来下载文件是非常方便的,更重要的是速度快.那么,它的速度非常之快,全速下载的时候明显地拉慢了…
由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textbox作显示,但是明明非常简单的代码,在编译的时候总是提示有错误.后来查看网上资料,才知道C#还有委托,匿名等等之类的新东西.下面我就把我这几天的经验和大家分享一下.这次就主要说说委托和匿名方法,以后在说说串口使用方面的经验. 先说一下委托的基本概念,委托是一种引用型的数据类型,其实它的概念和C语言的…
在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能 简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作. 要实现该功能,基本思路如下: 把想对另一线程中的控件实施的操作放到一个函数中,然后使用delegate代理那个函数,并且在那个函数中加入一个判断,用 InvokeRequired 来判断调用这个函数的线程是否和控件线程处…
原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转载权,未经允许,不得转载! 译者 : yuxingxin 项目地址 : RxJava-Essentials-CN 前面一章是最后一章关于RxJava的Observable的创建和操作的章节.我们学习到了如何将两个或更多的Observables合并在一起,join它们,zip它们,merge它们以及如何创建一个…
几个进程在大多数情况下要包含很多的子线程,那么他们之间免不了的要互相传递很多的参数,那么参数怎么传递的呢? 主线程向子线程传递参数的方法 第一种方法:Thraed类有一个带参数的委托类型的重载形式,这个委托的定义如下: public delegate void ParameterizedThreadStart(Object obj) 这个Thread类的构造方法的定义如下: public Thread(ParameterizedThreadStart start); 下面的代码使用了这个带参数的…
首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常. 代码 );        }        public void run()        {            try            {                throw new Exception();            }            catch (Exception ex)            {                if (exceptio…
一.JS单线程.异步.同步概念 从上一篇说明vue nextTick的文章中,多次出现“事件循环”这个名词,简单说明了事件循环的步骤,以便理解nextTick的运行时机,这篇文章将更为详细的分析下事件循环.在此之前需要了解JS单线程,及由此产生的同步执行环境和异步执行环境. 众所周知,JS是单线程(如果一个线程删DOM,一个线程增DOM,浏览器傻逼了-所以只能单着了),虽然有webworker酱紫的多线程出现,但也是在主线程的控制下.webworker仅仅能进行计算任务,不能操作DOM,所以本质…
入门-------------------------------------------------------------------------------- 概述与概念    一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建. 创建和开始使用多线程    public Window1()    {        //主线程         //Code……        //使用匿名方法来启动子线程        Thread t = new Th…
(一)Main线程是个非守护线程,不能设置成守护线程. 这是因为,main线程是由java虚拟机在启动的时候创建的.main方法开始执行的时候,主线程已经创建好并在运行了.对于运行中的线程,调用Thread.setDaemon()会抛出异常Exception in thread "main"     java.lang.IllegalThreadStateException.测试代码如下: public class MainTest { public static void main(…
在Android里,UI线程是不同意被堵塞的.因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要如何通知UI线程呢? 我们能够在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完毕工作. 而关于主线程向子线程发送消息的内容能够看我的上一篇博客.当中讲到了Looper类及其两个重要方法和实现原理.…
开发语言:C#3.0 IDE:Visual Studio 2008 本系列教程主要包括如下内容: 1.  BeginInvoke和EndInvoke方法 2.  Thread类 3. 线程池 4. 线程同步基础 5. 死锁 6. 线程同步的7种方法 7. 如何在线程中访问GUI组件 一.线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行.这就需要在同一个进程中开启多个线程.我们使用C#编…
1.在子线程中是不能进行UI 更新的,而可以立刻更新的原因是:子线程代码执行完毕了,又自动进入到了主线程,这中间的时间非常的短,让我们误以为子线程可以更新UI.如果子线程一直在运行,则无法更新UI,因为无法进入到主线程.2.程序一开始运行就进入了主线程.3.处理某些数据太过费时,影响用户交互,可以开辟子线程处理,处理完之后,然后通知主线程进行界面更新.4.iOS中只有主线程 才能立即刷新UI.主线程中用于显示\刷新UI界面,处理UI事件(比如点击事件.滚动事件.拖拽事件等).耗时操作会卡住主线程…
最近在学习了Go 语言 ,  正好学习到了 协程这一块 ,遇到了困惑的地方.这个是go语言官方文档 . 在我的理解当中是,协程只能在主线程释放时间片后才会经过系统调度来运行协程,其实正确的也确实是这样的,但是我遇到了协程强占主线程的一个问题,经过帮助,现在已经了解.废话不多说,先看代码 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func main() { 9 go say("world&quo…
引用自 主线程退出对子线程的影响--YuanLi 的一段话: 对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程. 主线程退出后子线程的状态依赖于它所在的进程,如果进程没有退出的话子线程依然正常运转.如果进程退出了,那么它所有的线程都会退出,所以子线程也就退出了. 主线程退出,进程等待所有子线程执行完毕后才结束 进程启动后会默认产生一个主线程,默认情况下主线程创建的子线程都不是守…
和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发送数据,这个用的地方也是非常的多,例如当我们为了优化用户体验,我们会在不影响用户使用的情况下进行后台数据更新,好了废话不多说,开始我们今天的讨论. public class ThreadActivity extends Activity implements OnClickListener{ pri…
必须在主线程执行的任务: (1)UI更新 必须在非主线程中执行的任务 (1)Http请求 如执行:ImageHelper.getInstance().loadImageSync(picUrl); 外面必须包层线程…
前言: 主要分析下面的问题: 主线程启线程  主线程执行完毕,会关闭子线程吗? 子线程启线程  主线程执行完毕,会结束吗? 主进程启动进程,主进程执行完毕,会怎样? 子进程启动进程,进程执行完毕,又会如何? 1.主线程启线程 示例1.1 import time import threading def function(): time.sleep(2) print('sub thread [%s] execute done' % threading.currentThread().ident)…
Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc. 如果有BThread,调用了BThread.Synchronize(BProc),而BProc中释放了AThread procedure TBThread.BProc begin AThread.Terminate; AThread.WaitFor; AThread.Free; end; 此时我们的程序将会卡死,下面的代码…
在main中创建线程,我们称main线程为主线程,新建线程为子线程(其实没有什么主线程和子线程的父子概念,它们是平行的,为了好理解这样称呼),如果子线程内部执行相对比较耗时的操作,主线程执行的快,而且没有等待子线程执行完毕,此时主线程退出,进程被销毁,就会导致子线程无法执行完毕: 可以采用如下方式确保子线程执行完毕: 1. 主线程中采用pthread_join阻塞等待子线程结束,并回收资源: man手册对于该函数的描述: The pthread_join() function waits for…
在一次代码编写场景,需要post一些数据,同时携带获得的token,(但是token的有效时间是7200s),但是post需要很多次,很长时间,不可能2小时候中断程序,手动去获取token,这样效率太低下. 所以就想到,通过主线程维护一个Token(这个对象是我自己定义的),然后重新开辟子线程,让子线程去定时更新这个token. 首先写了子线程需要实现的功能: public class TokenThread implements Runnable { public void run() { w…
为什么要在非主线程创建NSTimer 将 timer 添加到主线程的Runloop里面本身会增加线程负荷 如果主线程因为某些原因阻塞卡顿了,timer 定时任务触发的时间精度肯定也会受到影响 有些定时任务不是UI相关的,本来就没必要在主线程执行,给主线程增加不必要的负担.当然也可以在定时任务执行时,手动将任务指派到非主线程上,但这也是有额外开销的. NSTimer的重要特性 NSTimer上的定时任务是在创建NSTimer的线程上执行的.NSTimer的销毁和创建必须在同一个线程上操作 NSTi…
Web Workers API - Web API 接口参考 | MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作.这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢. Web Workers 概念与用法 使用构造函数(例如,Worker())创建一个 worker…
转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385   居然话sis hu ok.com违禁 嗨~~~   想看原文请把空格去掉 我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)ap…
转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385   居然话sis hu ok.com违禁 嗨~~~   想看原文请把空格去掉 我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)ap…