标签: blocking

在另一个线程中运行WPF控件

我在我的项目中使用了一个可视化控件,它来自一个我没有源代码的库.
更新(大约200ms)以获得良好的UI响应时间需要很长时间,其中三个控件同时在屏幕上显示.(我可能需要一次更新所有三个,这使得我的UI在他们都在思考的时候停留了大约600毫秒).

我已经阅读了一些关于TaskSchedulers的帖子,并开始研究并行任务功能,作为在自己的线程中运行每个控件的一种方式.该平台将是多核的,所以我想利用同步处理.

问题是我甚至不知道我不知道如何解决这个问题.

是否有合适的设计模式用于在WPF中的主UI线程的单独线程中运行控件?

具体来说:它是第三方地图控件,当给定新位置或缩放级别时需要太长时间才能重绘(~200ms).可能有三个更新最多4Hz - 显然它们不会跟上..
我已经在用户控件中封装了WPF控件,并且需要在它自己的线程中运行每个实例,同时仍然捕获用户输入(鼠标点击, 例如).

更新:虽然我正在寻找解决方案,但到目前为止我已实施了以下内容.
我的主(UI)线程产生一个线程,该线程创建一个包含相关控件的新窗口,并将其定位在正确的位置(这样它看起来只是一个普通的控件).

_leftTopThread = new Thread(() =>
{
   _topLeftMap = new MapWindow()
   {
      WindowStartupLocation = WindowStartupLocation.Manual,
      Width = leftLocation.Width,
      Height = leftLocation.Height,
      Left = leftLocation.X,
      Top = leftLocation.Y,
      CommandQueue = _leftMapCommandQueue,
   };

   _topLeftMap.Show();
   System.Windows.Threading.Dispatcher.Run();

});

_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
Run Code Online (Sandbox Code Playgroud)

哪个CommandQueue线程安全的BlockingCollection队列,用于向地图发送命令(移动位置等).
现在的问题是,我可以

  • System.Windows.Threading.Dispatcher.Run()呼叫而有用户输入
  • 或阻塞CommandQueue,侦听主线程发送的命令

我无法等待命令,因为它会吸收我所有的线程CPU!
是否有可能阻止有事件消息泵的工作?

c# wpf multithreading blocking task-parallel-library

18
推荐指数
2
解决办法
1万
查看次数

导致阻塞的SQL Server SELECT语句

我们正在使用带有巨大select语句的SQL Server 2005数据库(没有行版本控制),我们看到它阻止其他语句运行(看到使用sp_who2).我没有意识到SELECT语句可能导致阻塞 - 我有什么办法可以缓解这种情况吗?

sql-server performance blocking

17
推荐指数
2
解决办法
7万
查看次数

C++ - Sleep()和cin如何工作?

只是好奇.实际上Sleep()的工作原理是什么(在windows.h中声明)?也许不只是那个实现,而是任何人.我的意思是 - 它是如何实现的?如何使代码在特定时间内"停止"?同样好奇cin >>和那些实际工作.他们到底做了什么?

我知道如何"阻止"继续运行的唯一方法是使用while循环,但考虑到与调用stdin方法时发生的事情相比需要大量的处理能力(仅比较一段时间(真实)从stdin读取,我猜这不是他们所做的.

c++ windows multithreading scheduler blocking

17
推荐指数
1
解决办法
6829
查看次数

互斥锁:"阻塞"是什么意思?

我一直在阅读多线程和共享资源访问,其中一个(对我而言)新概念是互斥锁.我似乎无法找到的是发现"临界区"被锁定的线程实际发生的情况.它说在许多地方线程被"阻止",但这意味着什么?是否暂停,锁定解除后会恢复吗?或者它会在"运行循环"的下一次迭代中再次尝试?

我问的原因是因为我想要系统提供的事件(鼠标,键盘等),它们(显然)在主线程上传递,在我的辅助线程的运行循环中的一个非常特定的部分处理.因此无论发生什么事件,我都会在自己的数据结构中排队.显然,数据结构需要一个互斥锁,因为它被两个线程修改.缺少的难题是:当事件在主线程上的函数中传递时会发生什么,我想将其排队,但是队列被锁定了?主线程是否会被暂停,还是会跳过锁定的部分并超出范围(丢失事件)?

multithreading mutex locking thread-safety blocking

17
推荐指数
3
解决办法
2万
查看次数

Java阻塞问题:为什么JVM会在许多不同的类/方法中阻塞线程?

更新:这看起来像一个内存问题.一个3.8 Gb的Hprof文件表明,当发生"阻塞"时,JVM正在转储它的堆.我们的运营团队发现该站点没有响应,进行了堆栈跟踪,然后关闭了该实例.我相信他们在堆转储完成之前关闭了网站.日志没有错误/异常/问题证据 - 可能是因为JVM在生成错误消息之前被杀死了.

原始问题我们最近出现了应用程序出现的情况 - 最终用户 - 要挂起.我们在应用程序重启之前得到了一个堆栈跟踪,我发现了一些令人惊讶的结果:527个线程,463个线程状态为BLOCKED.

在过去 过去被阻塞的线程通常有这个问题:1)一些明显的瓶颈:例如一些数据库记录锁定或文件系统锁定问题导致其他线程等待.2)所有被阻塞的线程将阻塞相同的类/方法(例如jdbc或文件系统clases)

不寻常的数据 在这种情况下,除了应用程序类(包括jdbc和lucene调用)之外,我还看到了各种类/方法被阻止,包括jvm内部类,jboss类,log4j等.

问题 是什么会导致JVM阻止log4j.Hierarchy.getLogger,java.lang.reflect.Constructor.newInstance?显然有些资源"稀缺",但哪些资源?

谢谢

堆栈跟踪摘录

http-0.0.0.0-80-417" daemon prio=6 tid=0x000000000f6f1800 nid=0x1a00 waiting for monitor entry [0x000000002dd5d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at sun.reflect.GeneratedConstructorAccessor68.newInstance(Unknown Source)
                at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
                at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
                at java.lang.Class.newInstance0(Class.java:355)
                at java.lang.Class.newInstance(Class.java:308)
                at org.jboss.ejb.Container.createBeanClassInstance(Container.java:630)

http-0.0.0.0-80-451" daemon prio=6 tid=0x000000000f184800 nid=0x14d4 waiting for monitor entry [0x000000003843d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at java.lang.Class.getDeclaredMethods0(Native Method)
                at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
                at java.lang.Class.getMethod0(Class.java:2670)

"http-0.0.0.0-80-449" daemon prio=6 tid=0x000000000f17d000 nid=0x2240 waiting for monitor entry …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection locking blocking concurrent-programming

17
推荐指数
1
解决办法
2万
查看次数

如何调用异步JavaScript函数并阻止原始调用者

我有一个有趣的情况,我通常聪明的头脑无法提出解决方案:)这是情况......

我有一个有get()方法的类...这个方法被调用来获取存储的用户首选项......它所做的是调用某个底层提供程序来实际获取数据...现在写入,它正在调用会话cookie的提供者...所以,get()调用providerGet()让我们说,providerGet()返回一个值,get()将它传递给调用者.调用者希望在它继续工作之前做出响应.

这是棘手的部分...我现在正在尝试实现一个异步的提供程序(在这种情况下使用本地存储)...所以,providerGet()将立即返回,已经调度到本地存储将调用,一段时间之后,调用一个传递给它的回调函数...但是,由于providerGet()已经返回,所以get()现在通过扩展到原来的被调用,它显然没有返回实际检索的数据.

那么,问题是,是否有一种方法可以基本上"阻止"从providerGet()返回,直到异步调用返回?请注意,出于我的目的,我并不关心这可能带来的性能影响,我只想弄清楚如何使其工作.

我不认为有办法,当然我知道我无法想出来...所以我想把它扔掉,看看其他人能想出来:)

编辑:我现在只是在学习问题的核心,即web sql API是非同步的这一事实,可能有一个解决方案...原来还有一个API的同步版本,我没有意识到...我现在正在阅读文档以了解如何使用它,但这可以很好地解决问题,因为providerGet()完全异步编写的唯一原因是允许该提供程序...获取的代码( )是我自己的抽象层的一部分,在各种存储提供商(cookies,web sql,localStorage等)之上,所以最低的共同点必须赢,这意味着如果一个是同步的,他们都必须是非同步的......唯一的一个是web sql ...所以如果有一种方法可以同步地做到这一点我的观点变得没有实际意义(尽管我认为仍然是一个有趣的问题)

edit2:好吧,似乎没有任何帮助......似乎API的同步版本没有在任何浏览器中实现,即使它是指定它只能从工作线程使用,所以这不无论如何它似乎都有所帮助.虽然,读一些其他的东西,听起来有一种方法来使用递归来拉动这个技巧...我现在正在抛出一些测试代码,如果/当我让它工作时我会发布它,看起来像一个非常有趣的一般地解决任何这种情况的方法.

编辑3:根据我下面的评论,我真的没办法完全按照自己的意愿行事.我要解决我当前问题的解决方案是不允许使用Web SQL进行数据存储.它不是理想的解决方案,但是由于该规范不断变化而且没有广泛实施,它不是世界末日......希望当它得到适当的支持时,同步版本将可用,我可以插入新的提供商,很高兴去.一般来说,似乎没有任何方式可以拉动这个奇迹...确认我的预期是这样的,但希望我错了这一次:)

javascript blocking

17
推荐指数
2
解决办法
1万
查看次数

如何检测和测量node.js中的事件循环阻塞?

我想监视node.js中每次运行事件循环的时间.但是我不确定衡量这一点的最佳方法.我能想出的最佳方式如下:

var interval = 500;
var interval = setInterval(function() {
    var last = Date.now();        
    setImmediate(function() {
        var delta = Date.now() - last;
        if (delta > blockDelta) {
            report("node.eventloop_blocked", delta);
        }
    });
}, interval);
Run Code Online (Sandbox Code Playgroud)

我基本上通过查看a的延迟来推断事件循环运行时间setInterval.我在阻塞节点模块中看到了相同的方法,但感觉不准确和沉重.有没有更好的方法来获取这些信息?

更新:更改了代码,以便setImmediate像hapi.js一样使用.

event-loop blocking node.js npm

17
推荐指数
1
解决办法
8488
查看次数

Lua - 从用户那里获取命令行输入?

在我的lua程序中,我想在继续操作之前停下来并要求用户确认.我不知道如何停止并等待用户输入,怎么办呢?

lua user-input blocking wait

16
推荐指数
3
解决办法
6万
查看次数

python子进程communication()块

我正在使用进程模块调用外部程序(plink.exe)来登录服务器; 但是当我呼叫通信来读取输出时,它就是阻塞.代码如下:

 import subprocess
 process = subprocess.Popen('plink.exe hello@10.120.139.170 -pw 123456'.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 print process.communicate() #block here
Run Code Online (Sandbox Code Playgroud)

我知道该块是因为plink.exe它仍在运行; 但我需要在子进程终止之前读取输出.反正有吗?

python subprocess blocking

15
推荐指数
1
解决办法
2万
查看次数

如何实现无锁,但阻塞行为?

我正在为密集型网络应用程序实现无锁单生成器单个使用者队列.我有一堆工作线程在他们自己的队列中接收工作,然后他们出列并处理.

从这些队列中删除锁已经大大提高了高负载下的性能,但是当队列为空时它们不再阻塞,这反过来导致CPU使用率急剧上升.

如何有效地导致线程阻塞,直到它成功出列或被杀/中断为止?

c linux blocking lock-free

15
推荐指数
3
解决办法
5543
查看次数