| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 933 人关注过本帖
标题:还是线程同步和异步调用问题!
只看楼主 加入收藏
wyc199288
Rank: 2
等 级:论坛游民
帖 子:17
专家分:15
注 册:2014-1-4
结帖率:60%
收藏
已结贴  问题点数:10 回复次数:7 
还是线程同步和异步调用问题!
采集数据线程一直不停,每次采集一遍就立刻发出信号告诉计算数据线程(开始计算了)和显示数据线程(开始显示在界面上了)。

不过,计算线程完成的速度是最快的,显示数据线程速度最慢,采集线程介于两者之间。

问题出现了,每次采集的数据放入缓存,只有计算线程能按时完成,而显示线程总是不能按时完成,所以只能显示部分或者重复显示(就是说它不完整或是出问题了)。

网上所有的异步调用或同步方法都是要一个线程做,一个线程等,反之亦然。可是我的采集线程是不能停的。

请问大家有什么思路?本人愚钝……多谢!
搜索更多相关主题的帖子: 网上 
2014-02-25 22:13
wawd74520
Rank: 2
等 级:论坛游民
帖 子:4
专家分:25
注 册:2011-12-10
收藏
得分:5 
计算线程既然这么快直接用采集线程实现即可
2014-02-27 14:46
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:5 
这个取决于你代码怎么写 如果你自己写不好线程这东西呢 你就用调度

[ 本帖最后由 wangnannan 于 2014-2-27 16:04 编辑 ]

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2014-02-27 15:53
做好每一天
Rank: 2
等 级:论坛游民
威 望:3
帖 子:25
专家分:37
注 册:2014-2-19
收藏
得分:0 
新手表示还没有写过线程的代码,过来学习。。。。。。。
2014-02-27 16:03
wyc199288
Rank: 2
等 级:论坛游民
帖 子:17
专家分:15
注 册:2014-1-4
收藏
得分:0 
回复 2楼 wawd74520
计算线程在算时,采集就断了,数据会漏,这样不好。如果能这样,就不用多线程了,一个函数走到底了,对吧?
2014-02-27 19:44
wyc199288
Rank: 2
等 级:论坛游民
帖 子:17
专家分:15
注 册:2014-1-4
收藏
得分:0 
回复 3楼 wangnannan
多线程的同步一直是困扰大众的问题。我想问,如果是你会怎么处理?
2014-02-27 19:45
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
ReaderWriterLock 或者Monitor 自己去了解哈

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2014-02-28 08:48
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
程序代码:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

public class ThreadDemo
{
    private Thread threadOne;
    private Thread threadTwo;
    private ArrayList stringList;
    private event EventHandler OnNumberClear;//数据删除完成引发的事件
    public static void Main()
    {
        ThreadDemo demo = new ThreadDemo(1000);
        demo.Action();
    }
    public ThreadDemo(int number)
    {
        Random random = new Random(1000000);
        stringList = new ArrayList(number);
        for (int i = 0; i < number; i++)
        {
            stringList.Add(random.Next().ToString());
        }
        threadOne = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
        threadTwo = new Thread(new ThreadStart(Run));//两个线程共同做一件事情
        threadOne.Name = "线程1";
        threadTwo.Name = "线程2";
        OnNumberClear += new EventHandler(ThreadDemo_OnNumberClear);
       
    }
    /// <summary>
    /// 开始工作
    /// </summary>
    public void Action()
    {
        threadOne.Start();
        threadTwo.Start();
    }
    /// <summary>
    /// 共同做的工作
    /// </summary>
    private void Run()
    {
        string stringValue = null;
        while (true)
        {
            Monitor.Enter(this);//锁定,保持同步
            stringValue = (string)stringList[0];
            Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);
            stringList.RemoveAt(0);//删除ArrayList中的元素
            if (stringList.Count == 0)
            {
                OnNumberClear(this, new EventArgs());//引发完成事件
            }
            Monitor.Exit(this);//取消锁定
            Thread.Sleep(5);
        }
    }

    //执行完成之后,停止所有线程
    void ThreadDemo_OnNumberClear(object sender, EventArgs e)
    {
        Console.WriteLine("执行完了,停止了所有线程的执行。");
        threadTwo.Abort();
        threadOne.Abort();
       
    }
}
简单多线程同步例子

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2014-02-28 08:50
快速回复:还是线程同步和异步调用问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018350 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved