Questions tagged «multithreading»

多线程是计算机或程序通过利用多个并发的执行流(通常称为线程)来并发或异步执行工作的能力。

4
使用Dispatcher.Invoke从非主线程更改WPF控件
我最近开始在WPF中编程,遇到了以下问题。我不知道如何使用该Dispatcher.Invoke()方法。我在线程方面有丰富的经验,我制作了一些简单的Windows Forms程序,其中我只是使用了 Control.CheckForIllegalCrossThreadCalls = false; 是的,我知道这很la脚,但是这些都是简单的监视应用程序。 事实是,现在我正在制作一个WPF应用程序,该应用程序在后台检索数据,我从一个新线程开始进行调用以(从Web服务器)检索数据,现在我想在WPF表单上显示它。问题是,我无法从该线程设置任何控件。甚至没有标签或其他任何东西。如何解决? 答案评论: @Jalfp: 因此,我在获取数据时在“新踩踏”中使用此Dispatcher方法吗?还是应该让后台工作人员检索数据,将其放入字段中,然后启动一个新线程,等待该字段填充,然后调用调度程序以将检索到的数据显示到控件中?


10
在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke
我有一个SafeInvoke Control扩展方法,类似于Greg D在这里讨论的方法(减去IsHandleCreated检查)。 我从System.Windows.Forms.Form以下方式调用它: public void Show(string text) { label.SafeInvoke(()=>label.Text = text); this.Show(); this.Refresh(); } 有时(此调用可能来自多个线程)会导致以下错误: System.InvalidOperationException 发生 Message=“在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke。 Source=“ System.Windows.Forms” StackTrace: at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) at System.Windows.Forms.Control.Invoke(Delegate method) at DriverInterface2.UI.WinForms.Dialogs.FormExtensions.SafeInvoke[T](T control, Action`1 action) in C:\code\DriverInterface2\DriverInterface2.UI.WinForms\Dialogs\FormExtensions.cs:line 16 怎么回事,如何解决?我知道这不是表单创建的问题,因为有时它一次只能工作一次,而下次又会失败,那么问题可能是什么呢? PS。我真的对WinForms感到很糟糕,是否有人知道一系列很好的文章来解释整个模型以及如何使用它?

2
多重处理导致Python崩溃,并在调用fork()时在另一个线程中发出了错误消息
我是Python的新手,并尝试为我的for循环实现Multiprocessing模块。 我有一个存储在img_urls中的图像网址数组,我需要下载并应用一些Google视觉。 if __name__ == '__main__': img_urls = [ALL_MY_Image_URLS] runAll(img_urls) print("--- %s seconds ---" % (time.time() - start_time)) 这是我的runAll()方法 def runAll(img_urls): num_cores = multiprocessing.cpu_count() print("Image URLS {}",len(img_urls)) if len(img_urls) > 2: numberOfImages = 0 else: numberOfImages = 1 start_timeProcess = time.time() pool = multiprocessing.Pool() pool.map(annotate,img_urls) end_timeProcess = time.time() print('\n Time …

6
NSOperation和NSOperationQueue工作线程与主线程
我必须在我的应用程序中执行一系列下载和数据库写入操作。我使用NSOperation和NSOperationQueue相同。 这是应用程序场景: 从某个地方获取所有邮政编码。 对于每个邮政编码,请提取所有房屋。 为每个房子获取居民详细信息 如前所述,我NSOperation为每个任务定义了一个。在第一种情况下(Task1),我正在向服务器发送请求以获取所有邮政编码。内的委托NSOperation将接收数据。然后将此数据写入数据库。数据库操作是在不同的类中定义的。从NSOperation类中,我正在调用数据库类中定义的写函数。 我的问题是数据库写操作是否发生在主线程或后台线程中?当我在A中调用它时, NSOperation我期望它在与相同的线程(不是MainThread)中运行NSOperation。有人可以在处理NSOperation和时解释这种情况吗NSOperationQueue?

15
是C ++读写int原子吗?
我有两个线程,一个线程更新一个int,另一个读取它。这是一个统计值,其中读取和写入的顺序无关紧要。 我的问题是,是否仍然需要同步对此多字节值的访问?或者换一种说法,可以完成部分写入并使其中断,然后进行读取。 例如,考虑一个值为0x0000FFFF的值,该值的增量值为0x00010000。 是否有一段时间我应该担心该值看起来像0x0001FFFF?当然,类型越大,越可能发生这种情况。 我一直同步这些类型的访问,但是很好奇社区的想法。

2
在ArrayBlockingQueue中,为什么将最终成员字段复制到本地最终变量中?
在中ArrayBlockingQueue,所有需要锁定的方法都将final在调用之前将其复制到局部变量lock()。 public boolean offer(E e) { if (e == null) throw new NullPointerException(); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { insert(e); return true; } } finally { lock.unlock(); } } 没有任何理由复制this.lock到一个局部变量lock时,现场this.lock的final? 此外,E[]在执行操作之前,它还会使用的本地副本: private E extract() { final E[] items = this.items; …



3
处理多个进程中的单个文件
我有一个大文本文件,我想在其中处理每一行(执行一​​些操作)并将它们存储在数据库中。由于单个简单程序花费的时间太长,我希望它可以通过多个进程或线程来完成。每个线程/进程应从单个文件中读取不同的数据(不同的行),并对它们的数据(行)进行一些操作,然后将它们放入数据库中,以便最后,我处理完所有数据,数据库随我需要的数据一起转储了。 但是我无法弄清楚如何解决这个问题。

10
什么时候ReaderWriterLockSlim比简单的锁好?
我用这段代码在ReaderWriterLock上做了一个非常愚蠢的基准测试,其中读取发生的频率比写入高4倍: class Program { static void Main() { ISynchro[] test = { new Locked(), new RWLocked() }; Stopwatch sw = new Stopwatch(); foreach ( var isynchro in test ) { sw.Reset(); sw.Start(); Thread w1 = new Thread( new ParameterizedThreadStart( WriteThread ) ); w1.Start( isynchro ); Thread w2 = new Thread( …

3
了解std :: hardware_destructive_interference_size和std :: hardware_constructive_interference_size
添加了C ++ 17std::hardware_destructive_interference_size和std::hardware_constructive_interference_size。首先,我认为这只是获得L1缓存行大小的一种可移植的方法,但这过于简单了。 问题: 这些常量与L1缓存行大小有何关系? 有没有一个很好的例子来说明他们的用例? 两者都被定义static constexpr。如果生成二进制文件并在具有不同缓存行大小的其他计算机上执行二进制文件,这不是问题吗?当您不确定代码将在哪台计算机上运行时,如何在这种情况下防止错误共享?

8
在C#中检测到ContextSwitchDeadlock错误
我正在运行C#应用程序,并且在运行时出现以下错误: 60秒钟以来,CLR无法从COM上下文0x20e480过渡到COM上下文0x20e5f0。拥有目标上下文/公寓的线程很可能执行非泵送等待或处理非常长时间运行的操作而不泵送Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或随着时间的推移不断累积内存使用量。为避免此问题,所有单线程单元(STA)线程都应使用泵送等待原语(例如CoWaitForMultipleHandles),并在长时间运行的操作中定期泵送消息。 任何人都可以在这里帮助我解决这个问题吗? 非常感谢。

4
为什么Thread不是抽象类,而start()不是final?
为什么将Thread类实现为常规类而不是将抽象run()方法实现为抽象类。 会不会带来任何问题?或以这种方式有什么用吗? 另外,该Thread.start()方法应该是一种非常特定的方法,其功能不能由任何其他类实现(如果我没记错的话)。因此,我想该final关键字比其他任何方法都更适合此操作。 但是我可以重写此方法并根据需要使用它, public class Test extends Thread { public static void main (String... args) { Thread test = new Test(); test.start(); } @Override public void run() { System.out.println("New thread started..."); } @Override public void start() { System.out.println("Did anyone tell you I will spawn a new thread??"); } } …

4
具有多处理功能的Celery并行分布式任务
我有一个CPU密集的Celery任务。我想使用许多EC2实例上的所有处理能力(核心)来更快地完成此工作(我认为是具有多处理功能的芹菜并行分布式任务)。 我想更好地理解所有术语,线程,多处理,分布式计算,分布式并行处理。 示例任务: @app.task for item in list_of_millions_of_ids: id = item # do some long complicated equation here very CPU heavy!!!!!!! database.objects(newid=id).save() 使用上面的代码(如果可能,还提供一个示例),如何通过Celery使用一项计算任务来拆分这项任务?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.