【问题标题】:How to call a thread from another thread in C#?如何从 C# 中的另一个线程调用一个线程?
【发布时间】:2017-10-08 02:46:09
【问题描述】:

我想知道如何在 C# Windows 窗体应用程序中从另一个线程调用一个线程。我正在使用 TCP/IP 通信开发 UI。在我的程序中,我在收到要在 UI 上的 Picture Box 上绘制的数据后,将数据从控制台应用程序(客户端)发送到 Windows 窗体应用程序(服务器)。

我在服务器上创建了两个线程,第一个线程是 Listener 线程(监听客户端套接字),第二个线程是 Handler 线程(处理从客户端套接字接收的数据)我想创建图形从处理程序线程中绘制线程。

目前,我正在处理程序线程中进行图形绘图,但我想在单独的线程中进行。请指导我该怎么做?

【问题讨论】:

  • 什么是'path'和'g'对象类型?
  • "path" 进行连续绘图,"g" 进行点绘图
  • 从另一个线程调用一个线程是什么意思?线程是否已经在运行并且您想向它传递数据?
  • 处理程序线程已经在运行,并且在这个共享块中,图形绘图是在这个线程内完成的,但我想创建一个用于图形绘图的新线程..在处理程序中读取和处理的数据线程是在另一个线程中绘制,我想知道如何创建一个用于绘制“数据”的线程?

标签: c# multithreading sockets graphics


【解决方案1】:

给这只猫剥皮的方法有上百万种,但我建议使用最简单的方法。我假设您知道如何创建线程等。

using System;
using System.Collections.Generic;
using System.Threading;

namespace foo
{
    class Packet
    {
        public double x;
        public double y;
        public double z;
    }

    public class Class1
    {
        Queue<Packet> qp;

        public Class1()
        {
            qp = new Queue<Packet>();
        }

        public void SendData(Packet p)
        {
            // prevent reader from accessing while we insert
            lock (qp)
            {
                qp.Enqueue(p);
            }
        }

        public void ProcessIncomingPackets()
        {
            Packet p;

            // or until we decide to stop
            while (true)
            {
                p = null;

                // prevent the writer from adding while we're reading and maybe removing an item
                lock (qp)
                {
                    if (0 < qp.Count)
                    {
                        p = qp.Dequeue();
                    }
                }

                // with lock released, do something if we have a packet
                if (null != p)
                {
                    // graph, etc.
                }

                // spin faster for better responsiveness and more wasted CPU
                Thread.Sleep(100); // milliseconds
            }
        }

    } // Class 1
} // namespace

还有一百万种方法可以优化它,但也会产生非常讨厌的错误。 因此,我建议您阅读有关同步、线程、消息传递的数据结构以及特定于 C# 的内容。一本关于通用同步/线程的优秀计算机科学书籍通常为理解您多年来将遇到的各种平台/语言特定实现提供了重要基础。在紧密循环中测试任何多线程代码是一个好主意,尤其是当您无法直接证明同步的正确性时。

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 2012-08-13
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多