Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Асинхронный вызов / 14 сообщений из 14, страница 1 из 1
05.02.2004, 10:27
    #32398905
nandji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
Есть форма Ф1 и форма Ф2.
Ф2 открывается по кнопке на Ф1.
В Ф2 должен происходить опрос устройства.
Опрос должен быть зациклен, т.е. как только он выполнился, он должен запуститься снова.
Опрос занимает порядка 330мс, поэтому чтоб приложение не "курило" нужен асинхронный вызов.
Подскажите как правильно сделать такую вещь ...
...
Рейтинг: 0 / 0
05.02.2004, 11:18
    #32399014
Alkash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
Делай опрос в другой нити
...
Рейтинг: 0 / 0
05.02.2004, 11:23
    #32399022
nandji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
Я просто с принципами реализации этого в .НЕТ не знаком
...
Рейтинг: 0 / 0
05.02.2004, 11:40
    #32399049
Andr2141
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
...
Рейтинг: 0 / 0
05.02.2004, 14:02
    #32399349
nandji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
читал ...
сейчас получается так что срид в которм идет опрос не останавливается когда я закрываю Ф2.
и когда я в следующий раз открываю Ф2 создается второй срид под опрос и так далее :) хелп
...
Рейтинг: 0 / 0
05.02.2004, 14:12
    #32399374
Andr2141
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
Я так понимаю что Ф2 не уничтожается из памяти при закрытии
по- этому и живет поток который создан внутри этого класса
надо явно попробовать при закрытии формы термеировать поток
...
Рейтинг: 0 / 0
05.02.2004, 14:36
    #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
05.02.2004, 14:38
    #32399434
nandji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
Ф2.ShowDialog(this);
Ф2.Dispose();
и после этого сирано срид работает...
...
Рейтинг: 0 / 0
05.02.2004, 15:05
    #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
05.02.2004, 15:09
    #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
05.02.2004, 18:27
    #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
05.02.2004, 21:00
    #32400057
nandji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
тормозит форма ... так будто по таймеру синхронно опрашивается компорт
...
Рейтинг: 0 / 0
05.02.2004, 21:07
    #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
05.02.2004, 21:18
    #32400065
nandji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронный вызов
учитывая что опрос длится порядка 330 мс тормоза такие будто весы опрашиваются синхронно по таймеру с интервалом 500мс
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Асинхронный вызов / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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