powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Асинхронный вызов
14 сообщений из 14, страница 1 из 1
Асинхронный вызов
    #32398905
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть форма Ф1 и форма Ф2.
Ф2 открывается по кнопке на Ф1.
В Ф2 должен происходить опрос устройства.
Опрос должен быть зациклен, т.е. как только он выполнился, он должен запуститься снова.
Опрос занимает порядка 330мс, поэтому чтоб приложение не "курило" нужен асинхронный вызов.
Подскажите как правильно сделать такую вещь ...
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399014
Alkash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делай опрос в другой нити
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399022
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто с принципами реализации этого в .НЕТ не знаком
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399049
Andr2141
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399349
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читал ...
сейчас получается так что срид в которм идет опрос не останавливается когда я закрываю Ф2.
и когда я в следующий раз открываю Ф2 создается второй срид под опрос и так далее :) хелп
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399374
Andr2141
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю что Ф2 не уничтожается из памяти при закрытии
по- этому и живет поток который создан внутри этого класса
надо явно попробовать при закрытии формы термеировать поток
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399424
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал как тут
раздел Async Notification: Delegates

Код: plaintext
1.
2.
3.
4.
5.
private void WorkGraded(IAsyncResult res) {
    WorkCompleted wc = (WorkCompleted)res.AsyncState;
    int grade = wc.EndInvoke(res);
    Console.WriteLine( "Worker grade= "  + grade);
    DoWork(); //доделка дабы зациклить
}


можно ведь так ?
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399434
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ф2.ShowDialog(this);
Ф2.Dispose();
и после этого сирано срид работает...
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399509
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня код получился такой ... вдруг поможет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
//скип using
namespace myApp
{
    public class Form1 : System.Windows.Forms.Form
    {
        //скип инициализация
        private void butNew_Click(object sender, System.EventArgs e)
        {
            Form1 f = new Form1();
            f.ShowDialog(this);
            f.Dispose();
        }
        //скип
    }

    public class Form2 : System.Windows.Forms.Form
    {
        private Scale sc;
        //поскипано инициализация
        public Form2()
        {
            InitializeComponent();
            this.sc = new Scale() ;
            this.sc.OnCheckCompleted += new CheckCompletedDelegate(this.CheckCompleted);
        }
        //скип
    
        private void Form2_Load(object sender, System.EventArgs e)
        {
            this.sc.Check();
        }

        public void CheckCompleted(string data) 
        {
            this.textVes.Text = data
        }
    }
    
    delegate void CheckCompletedDelegate(string Data);
    
    class Scale 
    {
        public void Check()
        {
            APScale.APScaleClass scale = new APScale.APScaleClass();
            scale.Connect( "COM1" );
            string data = scale.Data as string;
            scale.DisConnect();

            if( OnCheckCompleted != null ) 
            {
                foreach( CheckCompletedDelegate ccd in OnCheckCompleted.GetInvocationList() ) 
                {
                    ccd.BeginInvoke(data, new AsyncCallback(CheckCompletedCallback), ccd);
                }
            }
        }
        
        public event CheckCompletedDelegate OnCheckCompleted;
        
        private void CheckCompletedCallback(IAsyncResult res) 
        {
            CheckCompletedDelegate ccd = (CheckCompletedDelegate)res.AsyncState;
            ccd.EndInvoke(res);
            Check();
        }
    }
}
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399518
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private void butNew_Click(object sender, System.EventArgs e)
{
Form1 f = new Form1();
f.ShowDialog(this);
f.Dispose();

Form2 f = new Form2(); конечно же
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32399960
Andr2141
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне видится этот процесс так
хоть по рабоче-крестьяенске но должен пахать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace CommRequest
{
   public delegate void CheckCompletedDelegate(string Data);

   public class Form2 : System.Windows.Forms.Form
  {
     private System.ComponentModel.Container components = null;
     private System.Threading.Thread TreadCheckComm;
     public event CheckCompletedDelegate OnCheckCompleted;
     private bool Terminate;
        
    void ReadCompleted(string Data)
   {
        // Здесь читаем результат 
   }

   private void GetCOMData()
  {
       while (!Terminate)
       { 
	// Здесь читаем данные из порта

	scale.Connect( "COM1" );
             string data = scale.Data as string;
	scale.DisConnect();

             if (OnCheckCompleted != null)
	{OnCheckCompleted(data);}
       }
  }

  private void Form2_Load(object sender, System.EventArgs e)
 {
     // Создаем объект scale
    APScale.APScaleClass scale = new APScale.APScaleClass();

    this.OnCheckCompleted += new CheckCompletedDelegate(this.ReadCompleted); 
    Terminate = false;
    TreadCheckComm =  new System.Threading.Thread(new     System.Threading.ThreadStart(GetCOMData));
     TreadCheckComm.Start(); 
  }


private void Form2_Closed(object sender, System.EventArgs e)
{
    Terminate = true;               // Терминируем поток
    TreadCheckComm.Join();    // Ждем пока терменируется
     // Уничтожаем объект  scale		
 }
}
}

...
Рейтинг: 0 / 0
Асинхронный вызов
    #32400057
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тормозит форма ... так будто по таймеру синхронно опрашивается компорт
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32400059
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал свой пример ....

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace vesi
{
    public class Form2 : System.Windows.Forms.Form
    {
        Scale s = new Scale();
        private void Form2_Load(object sender, System.EventArgs e)
        {
            s.CheckComplete+=new CheckCompleteHandler(s_CheckComplete);
            s.BeginCheck();
        }
        private void s_CheckComplete(string data)
        {
            this.textBox.Text=data;
            s.BeginCheck();
        }
    }
    public class Scale
    {
        APScale.APScaleClass scale = new APScale.APScaleClass();
        bool terminate = false;

        public void BeginCheck()
        {
            CheckDelegate check = new CheckDelegate(Check);
            check.BeginInvoke(new AsyncCallback(EndCheck), check);
        }
        string Check()
        {
            scale.Connect( "COM1" );
                string data = this.scale.Data as string;
            scale.DisConnect();
            return data;
        }
        void EndCheck(IAsyncResult ar)
        {
            CheckDelegate check = (CheckDelegate)ar.AsyncState;
            string data = check.EndInvoke(ar);
            if (!terminate)
            {CheckComplete(data);}
        }
        public void Terminate()
        {
            terminate=true;
        }
        public event CheckCompleteHandler CheckComplete;
    }
    delegate string CheckDelegate();
    public delegate void CheckCompleteHandler(string data);
}

та же фигня
...
Рейтинг: 0 / 0
Асинхронный вызов
    #32400065
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
учитывая что опрос длится порядка 330 мс тормоза такие будто весы опрашиваются синхронно по таймеру с интервалом 500мс
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Асинхронный вызов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]