如何从不同线程访问对象而不发生冲突?

发布于 2024-12-13 12:06:47 字数 1588 浏览 1 评论 0原文

我有一个名为 fetchImage 的线程,它运行 startFetch() 方法,它是

     for (int i = 0; !stopFetching && i < 2000; i++) {
      control.fetchImage().Save("Fetch_Image\\fetchedFile" + fileName + ".JPG", System.Drawing.Imaging.ImageFormat.Jpeg);
            fileName++;
        //Thread.Sleep(800);
            Console.WriteLine("Filename :" + fileName);

另一个具有 fetchImage() 方法的类:

 return (System.Drawing.Bitmap)mainForm.imageTemp.Clone();

mainForm 是一个具有名为 imageTemp 的 Image 变量的表单。现在,当我有 Thread.Sleep(800) 时,startFetch() 运行正常,但它在没有睡眠的情况下给了我这个错误。这是错误的堆栈跟踪

System.InvalidOperationException was unhandled
  Message=Object is currently in use elsewhere.
  Source=System.Drawing
  StackTrace:
       at System.Drawing.Image.Clone()
       at KiPNi.Control.fetchImage() in F:\CMPS285\285-fall10-5\Final working code\WindowsFormsApplication7\Control.cs:line 65
       at KiPNi.Form4.startFetch() in F:\CMPS285\285-fall10-5\Final working code\WindowsFormsApplication7\Form4.cs:line 80
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

我对线程不太了解(尽管我在遇到这个问题后尝试过)。

如何从 fetchImage 线程访问图像?

I have a thread named fetchImage that runs startFetch() method, which is

     for (int i = 0; !stopFetching && i < 2000; i++) {
      control.fetchImage().Save("Fetch_Image\\fetchedFile" + fileName + ".JPG", System.Drawing.Imaging.ImageFormat.Jpeg);
            fileName++;
        //Thread.Sleep(800);
            Console.WriteLine("Filename :" + fileName);

control is another class that has fetchImage() method:

 return (System.Drawing.Bitmap)mainForm.imageTemp.Clone();

mainForm is a form that has Image variable named imageTemp. Now startFetch() runs fine when I have Thread.Sleep(800) but it gives me that error without the sleep. Here is the stack trace of the error

System.InvalidOperationException was unhandled
  Message=Object is currently in use elsewhere.
  Source=System.Drawing
  StackTrace:
       at System.Drawing.Image.Clone()
       at KiPNi.Control.fetchImage() in F:\CMPS285\285-fall10-5\Final working code\WindowsFormsApplication7\Control.cs:line 65
       at KiPNi.Form4.startFetch() in F:\CMPS285\285-fall10-5\Final working code\WindowsFormsApplication7\Form4.cs:line 80
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

I do not know much about threads (although I tried after encountering this problem).

How do I get access to the image from the fetchImage thread?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

比忠 2024-12-20 12:06:47

不要从处理线程中拉取数据,而是看看当有帧更新时是否可以从 UI 线程推送数据 - 这样,您就可能< /strong> 避免锁定;如果您可以创建图像数据的克隆,则可以避免在线程之间共享对象。

无论如何,您实际上只应该从主线程调用 UI 控件上的方法(Control.BeginInvoke() 存在,但最好尝试修改您的设计以避免它(如果可能)。

Instead of pulling data from the processing thread, see if it's possible to push data from the UI thread when there's a frame update - that way, you can possibly avoid locking; if you can create a clone of the image data, you avoid sharing the object between threads.

You really only should be invoking methods on UI controls from the main thread anyway (Control.BeginInvoke() exists, but it's better trying to modify your design to avoid it, if possible).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文