从主程序切换表单

时间:2018-05-22 13:52:39

标签: c# multithreading forms

我需要做的是自助服务终端应用程序,它从串行端口读取信息,并根据收到的数据在三种不同的表单之间切换。表格也可以通过按钮在彼此之间切换。

simplyfing:

1 Form1有效,直到收到数据

2个主程序读取数据

3 form1已关闭

4 form2 opend和精心复制的数据

单击5 form2按钮

6 form3打开

7表格2关闭

8循环重启

我的方法 就是用这个例子 https://www.codeproject.com/Articles/7536/How-To-Swap-Top-Level-Forms?msg=969882并且我对ApplicationContext进行了修改但是如果我使用originale示例它可以工作,但我不知道如何使用委托传递方法,如果我使用修改后的代码,则可以传递委托表单冻结和一段时间形式不公开。我不确定这是一种麻烦的方式,我无法将readin串行数据移动到form1

要遵循的任何建议或示例?

ko.observableArray.fn.refresh = function (item, index) {
    if (index==null) index = this['indexOf'](item);
    if (index >= 0) {
        this.splice(index, 1, ko.utils.extend({}, item)) // create new item
        //this.splice(index, 1);
        //this.splice(index, 0, item);
    }
}

1 个答案:

答案 0 :(得分:0)

它冻结是因为您的SerialReceived方法中有use Monolog\Logger; use Monolog\Handler\StreamHandler; $ipAddress = GeoIp\Manager::getRealIp(); $geoResult = GeoIp\Manager::getDataResult($ipAddress, 'ru'); $logger = new Logger('Debug'); $logger->pushHandler(new StreamHandler($_SERVER['DOCUMENT_ROOT'].'/logs/geo.log', Logger::DEBUG)); $logger->info('Location:', array('object' => print_r($geoResult, true))); 。因此,如果您获得了大量数据,那么您在任何时候都会被冻结。

您的串行IO事件中不应该有线程暂停,因为它会备份数据,并且根据您的波特率,您可能会丢失数据(底层芯片,称为UART不带有数据)很多板载内存来存储所有缓冲的数据。)