多线程复用以下延时过程,会排队吗?时序会乱吗?会线程不安全吗?

问题描述

privatevoidDelay(intt){System.Diagnostics.Stopwatchsw=newSystem.Diagnostics.Stopwatch();sw.Restart();while(sw.ElapsedMilliseconds<t){Thread.Sleep(1);Application.DoEvents();}sw.Stop();}

就很简单的延时程序,但多个地方多线程都用到它,是否会冲突??

解决方案

本帖最后由 sosoben 于 2016-01-22 17:01:34 编辑
解决方案二:
你方法内部都是私有的,不会有冲突,但你每一毫秒就Application.DoEvents(),这个会出问题的
解决方案三:
多线程中私有变量,是没有影响的!
解决方案四:
多线程调用不排队,“时序会乱”搞不懂你什么意思,你使用的都是局部变量没什么不安全。我唯一不理解的是明明一句Thread.Sleep就能解决的事情为何要做的如何麻烦。
解决方案五:
sw.Restart();是不是应该放在DoEvents()后面才有用,那样就类似定时器了如果是那样,System.Threading.Timer可能更适合你也可以借助生产者-消费者模式采用一个定时器,轮询处理所有的延时任务
解决方案六:
正确的事情总是很简单很干净的,而诡异的事情总是就扯在一起的显得很庞大很脏乱。这里至少有3个错误的概念组合在一起:1.既然是子线程,就不用扯什么Application.DoEvents。那个是用在vb5、vb6那样的单线程程序中的语法,在.net中就算是你想写它,也是用在UI主线程上。怎么可能跟“多线程”搅和在一起呢?既然你都多线程了,还在子线程中写什么DoEvents干嘛呢?2.在你的思维中,线程就是要刻意地去“停”那么一段时间,而不是注册一个定时器事件在一定时间唤醒后续的事情。在你看来,一堆什么正事儿也不干的子线程在进程中,对内存使用和CPU使用状况都似乎没有危害似地。3.在你看来,死等的时候,还必须无限制地(理论上顶多隔上1~10毫秒)干一些职责以外的事情,并且具体干什么也不确定,这样才能体现编程比较花哨。
解决方案七:
引用1楼starfd的回复:

你方法内部都是私有的,不会有冲突,但你每一毫秒就Application.DoEvents(),这个会出问题的

引用5楼sp1234的回复:

正确的事情总是很简单很干净的,而诡异的事情总是就扯在一起的显得很庞大很脏乱。这里至少有3个错误的概念组合在一起:1.既然是子线程,就不用扯什么Application.DoEvents。那个是用在vb5、vb6那样的单线程程序中的语法,在.net中就算是你想写它,也是用在UI主线程上。怎么可能跟“多线程”搅和在一起呢?既然你都多线程了,还在子线程中写什么DoEvents干嘛呢?2.在你的思维中,线程就是要刻意地去“停”那么一段时间,而不是注册一个定时器事件在一定时间唤醒后续的事情。在你看来,一堆什么正事儿也不干的子线程在进程中,对内存使用和CPU使用状况都似乎没有危害似地。3.在你看来,死等的时候,还必须无限制地(理论上顶多隔上1~10毫秒)干一些职责以外的事情,并且具体干什么也不确定,这样才能体现编程比较花哨。

谢谢各位大大的指教,我也知道sleep跟doevents用的不对的了。但由于主窗体UI线程也调用过这个delay,这时就需要doevent了。而又不想占用太多CPU处理时间,所以就sleep(1)了。(其实这也是我编程不到家的体现,因为有时候我调试时想分步执行,用多线程就会显得不确定了,于是我就先取消多线程,用窗口线程执行,分步看效果)当然,这都是我的历史遗留问题,按各位的意思,我在主窗体的线程中用doevents,多线程中用sleep就没错了是吗?还有,版主大人,每毫秒就执行一次doevents会出现什么问题?可以说说吗?
解决方案八:
再补充一下,其实是用这个做机械设备的运动控制的在发命令让一个东西动到它的真正到位反馈给我是需要一定时间的延时(到什么位我只能知道个大概,不确定,然后用机器视觉捕捉),所以我就相应延时这样一段时间。这些都在一个子线程里,然后我想急停的话就终止这个线程并停止电机。“注册一个定时器事件在一定时间唤醒后续”这个我不太能理解,有没有相关例程?就是到了需要停的地方不断问某个变量?时间一使它改变了就继续下去?还是说用waithandle?Monitor?
解决方案九:
好像是不更新ui,不知道有没有记错,你可以实验下
解决方案十:
publicvoidUpandDown(doubleoffset1,doubleoffset2,doubleoffset3){System.Threading.ThreadUpDown1=newSystem.Threading.Thread(()=>UpDown(offset1,offset2,offset3));UpDown1.IsBackground=true;UpDown1.Start();Delay(1500);//我怀疑有问题就是这个deley了,当然也有可能是上面的问题//UpDown(offset1,offset2,offset3);}

引用8楼starfd的回复:

好像是不更新ui,不知道有没有记错,你可以实验下

试验结果:如果是主窗口线程(UI)调用,则不加doevents会不更新UI在多线程里用,则加不加都一样(不考虑其他特殊情况),UI都能刷新
解决方案十一:
引用5楼sp1234的回复:

正确的事情总是很简单很干净的,而诡异的事情总是就扯在一起的显得很庞大很脏乱。这里至少有3个错误的概念组合在一起:1.既然是子线程,就不用扯什么Application.DoEvents。那个是用在vb5、vb6那样的单线程程序中的语法,在.net中就算是你想写它,也是用在UI主线程上。怎么可能跟“多线程”搅和在一起呢?既然你都多线程了,还在子线程中写什么DoEvents干嘛呢?2.在你的思维中,线程就是要刻意地去“停”那么一段时间,而不是注册一个定时器事件在一定时间唤醒后续的事情。在你看来,一堆什么正事儿也不干的子线程在进程中,对内存使用和CPU使用状况都似乎没有危害似地。3.在你看来,死等的时候,还必须无限制地(理论上顶多隔上1~10毫秒)干一些职责以外的事情,并且具体干什么也不确定,这样才能体现编程比较花哨。

还有一种情况是下位机需要一个上升沿信号,而且维持时间要超过100毫秒,这种情况很多,如果都用sleep的话界面也会一卡一卡的。这种情况能应用“注册一个定时器事件在一定时间唤醒后续的事情”吗?大概是个什么样的架构,可以详细介绍下吗?

时间: 2024-09-14 22:12:26

多线程复用以下延时过程,会排队吗?时序会乱吗?会线程不安全吗?的相关文章

Java多线程中的延时队列DelayQueue

慢慢进入JAVA的内心世界, 今天也一直在和JAVA的语法作斗争, 到周三,写的一个基于SPRING BOOT的日志小模块, 成型啦~~ 关于DelayQueue,书上是这样说的: Student.java package demo.thread; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; public class Student implements Delayed{ private S

iOS多线程的初步研究(四、五、六)--NSTimer--NSURLConnection子线程中运行 ---- NSOperation

iOS多线程的初步研究(四)-- NSTimer 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的. 先看看NSTimer的两个常用方法: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; //生成

多线程-android 多个文件,每个文件都使用断点下载,线程是否会太多

问题描述 android 多个文件,每个文件都使用断点下载,线程是否会太多 我现在想使用文件的断点下载功能,每个文件可以分成几断,使用线程下载,如果存在多个文件都是用线程下载的话,线程有点多,怎样才是一个合适的方法 解决方案 可以试试线程池,或者做一个自己控制的线程队列 解决方案二: 线程池,或者就用AsyncTask,里面用的就是线程池.

java必学必会之线程(1)_java

一.线程的基本概念 线程理解:线程是一个程序里面不同的执行路径 每一个分支都叫做一个线程,main()叫做主分支,也叫主线程. 程只是一个静态的概念,机器上的一个.class文件,机器上的一个.exe文件,这个叫做一个进程.程序的执行过程都是这样的:首先把程序的代码放到内存的代码区里面,代码放到代码区后并没有马上开始执行,但这时候说明了一个进程准备开始,进程已经产生了,但还没有开始执行,这就是进程,所以进程其实是一个静态的概念,它本身就不能动.平常所说的进程的执行指的是进程里面主线程开始执行了,

从零开始学.net多线程系列(一)

本篇涉及话题: 什么是进程 时间片 多线程的进程 线程本地存储(TLS) 中断 线程睡眠和时钟中断 线程退出/完成 什么是AppDomain 为什么你应该使用AppDomain 给AppDomain设置数据 NUnit与AppDomain 线程优先级 启动线程 回调 回顾与展望 --------------------------------------------------------------------------------------------------------------

iOS - Threads 多线程

1.Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开 QQ.Xcode,系统就会分别启动两个进程.通过 "活动监视器" 可以查看 Mac 系统中所开启的进程. 一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存. 1.2 线程 线程是进程中执行任务的基本执行单元.一个进程要执行任务,必须得有线程,一个进程(程序)的所有任务都在线程中执行.每一个进程至少有一条线程

MySQL redo死锁问题排查及解决过程详解

问题背景   周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪,还好现场环境还在,为排查问题提供了一个好的环境,随即便投入到紧张的问题排查过程当中.问题实例表现如下: 并发量为 384 的时候出现的问题: MySQL 服务器无法执行事务相关的语句,即使简单的 select 语句也无法执行: 所有线程处于等待状态,无法 KILL. 现场环境的收集

基于Oracle plsql的多线程编程架构 (附存储过程)

作者介绍冯守东,北京科讯华通科技发展有限公司高级项目经理.超12年Oracle开发及管理经验,多年运营商和政府企业级系统运维经验,曾获得东软最佳设计方案奖.熟悉Weblogic.TUXEDO.IBM WAS等相关中间件运维.熟悉MySQL.DB2.Informix等其他开源或商业数据,以及Openstack.Hadoop相关生态系统.网站架构设计等.    引言    1 文档编制目的  在日常编程范围内有很多大计算量的存储过程,在业务系统中使用Java实现多线程往往会有参与计算的任务不能均匀分

VC多线程编程

一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为"延时6秒",添加按钮的响应函数,代码如下:  void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); //延时6秒} 编译并运行应用程序,单击"延时6秒"按钮,你就会发现在这6秒期间程序就