Страницы

Ярлыки

ДШИ-200 (1) КСВУ-6 (1) ЛЧМ (1) МДР-23 (1) микроконтроллер (1) перенаправление (1) С (1) структуры (1) учебный курс (1) AC/DC (1) ADC (1) ADS1248 (1) Altium (1) Altuim (1) Amolifer (1) ARM (1) assembler (2) Asynchronous (1) at command (3) at#eaddr (1) at#epassw (1) at#esmtp (1) at#euser (1) at#gprs (1) at#selint=2 (1) at#sgact (1) at#tcpatcmdseq (1) ATX (1) AVR (2) bit (1) boost (1) boot (2) bootlloader (1) C (6) C# (7) C++ (1) CMSIS (1) command (1) CP2101 (1) CSD (1) Danfoss (6) DBGMCU (1) debug (1) debug.ini (1) delegate (1) Discovery (1) DMA (1) DRV8805 (1) DWT (1) e-mail (1) email (1) Exel (1) exFAT (1) FC-051 (1) gl868-dual (2) gl868-dual cmux (1) GPIO (2) GSM (1) I2C (1) IAR (1) ID (1) Invoke (1) Keil (3) LabVIEW (1) Linux (1) LMP7721 (1) LoRa (3) mdmread (1) memory (1) MODBUS (1) Operation Amplifer (1) pack (1) printf (2) printf() (1) RCC (1) retargetting (1) RFM95/96/87/98(W) (1) RS232 (4) RS485 (1) RSAPI.DLL (1) RSS (1) RTC (2) send (2) SerialPort (1) Silabs (1) spl (1) standard peripherals library (1) startup (1) stepper (2) STlink (1) STlink/V2 (2) STM32 (10) stm32 stm32f10x (1) STM32DBG.IN (1) STM32F (19) STM32F103 (4) struct (1) Structure (1) system (1) SystemInit (1) Task (1) telit (5) thread (4) TIM (1) Type Cast (1) UART (1) uni-trend (1) USART (6) USB (1) UT61B (1) viewer (1)

среда, 13 мая 2015 г.

C# Cross-thread operations & Invoke((MethodInvoker)delegate () - делегат

MethodInvoker - делегат представляет солобой делегата, который может выполнить любой метод в управляемом коде, объявляемый с пустым списком параметров и не принимающий параметры. Этот делегат можно использовать при вызовах метода Invoke элемента управления или когда требуется простой делегат, но определять его не требуется. В следующем примере кода демонстрируется использование объекта MethodInvoker для вызова метода, обновляющего заголовок окна формы приложений и двух разных форм. Обращение из потока к форме невозможно напрямую , для этого правильнее всего использовать eventы, но если очень хочется и не слишком часто то можно например так

ЯИМЯКОНТРОЛА.Invoke((MethodInvoker)(delegate(){
Тут делать что угодно с ЯИМЯКОНТРОЛА 
}));

BeginInvoke(new MethodInvoker(delegate
            {
                //здесь твой код в основном потоке
            }));

public partial class Form1 : Form
{
    public Form1()
    {
        // Create a timer that will call the ShowTime method every second.
        var timer = new System.Threading.Timer(ShowTime, null, 0, 1000);           
    }

    private void ShowTime(object x)
    {
        // Don't do anything if the form's handle hasn't been created 
        // or the form has been disposed.
        if (!this.IsHandleCreated && !this.IsDisposed) return;

        // Invoke an anonymous method on the thread of the form.
        this.BeginInvoke((MethodInvoker) delegate
        {
            // Show the current time in the form's title bar.
            this.Text = DateTime.Now.ToLongTimeString();
           textBox1.Text = DateTime.Now.ToLongTimeString();
           richTextBox1.Text = DateTime.Now.ToLongTimeString();
        });
    }
}
Ещё один пример - прием данных с АЦП. Данные приходят из порта после посылки 
запроса - отправки байта "0xFF".
using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Thread newthread; public Form1() { InitializeComponent(); serialPort1.Open(); } private void func() { int iii = 10; while (true) { Invoke((MethodInvoker)delegate () { var dataArray = new byte[] { 0xFF }; serialPort1.Write(dataArray, 0, 1); Thread.Sleep(50); string res = serialPort1.ReadExisting(); textBox1.Text = ("\n" + "\r" + res); }); } } private void button1_Click(object sender, EventArgs e) { newthread = new Thread(func); newthread.Start(); } private void button2_Click(object sender, EventArgs e) { newthread.Abort(); } private void Close(object sender, FormClosingEventArgs e) { newthread.Abort(); } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { } } }

Комментариев нет:

Отправить комментарий

ваше мнение...