Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2010, 00:13   #1
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
Печаль Отрисовка Series при перемещении формы

Всем доброй ночи. Есть вот такая программа:

Читает данные из файла, передает их по COM-порту и тем временем отрисовывает эти значения в двух чартах.

Столкнулся с такой проблемой:
Пока идет цикл (чтение, передача, отрисовка) мне нужно переместить форму (за ее заголовок). При данной операции цикл "подвисает", пока я не отпущу заголовок окна, что не есть комильфо.

Есть способы "вылечить" этот недуг? (цикл в таймер не предлагайте, он не подходит для данной программы).
Вот код:

Код:
// старт "передача"
procedure TMainForm.Button1Click(Sender: TObject);
label STOP_TR;
begin
Button3.Enabled:=False;
Button2.Enabled:=True;
Button1.Enabled:=False;
i:=Dat_Start;
ProgressBar1.Min:=0;
ProgressBar1.Max:=Dat_Stop-Dat_Start;
//
Chart1.BottomAxis.Maximum:=(Dat_Start/4)/freq+10;
Chart1.BottomAxis.Minimum:=(Dat_Start/4)/freq;
Chart2.BottomAxis.Maximum:=(Dat_Start/4)/freq+10;
Chart2.BottomAxis.Minimum:=(Dat_Start/4)/freq;
//
d:=0;
S_STOP:=FALSE;
  while i<=Dat_Stop do begin
  p:=char(b)+char(e)+{ЭМГ}char(Dat_Arr[i])+char(Dat_Arr[i+1])+{ЭКГ}char(Dat_Arr[i+2])+char(Dat_Arr[i+3]);
  ProgressBar1.Position:=ProgressBar1.Position+4;
  Vacomm1.WriteText(p);
    // смещение графиков
    if (Chart1.BottomAxis.Maximum-(i/4)/freq)=0 then begin
      Chart1.BottomAxis.Maximum:=Chart1.BottomAxis.Maximum+10;
      Chart1.BottomAxis.Minimum:=Chart1.BottomAxis.Minimum+10;
      Chart2.BottomAxis.Maximum:=Chart2.BottomAxis.Maximum+10;
      Chart2.BottomAxis.Minimum:=Chart2.BottomAxis.Minimum+10;
    end;
    // отрисовка
    d:=d+1;
    if d=4 then begin
      d:=0;
      Series2.AddXY((i/4)/freq,Conversion(Dat_Arr[i],Dat_Arr[i+1])); // Эмг
      Series1.AddXY((i/4)/freq,-Conversion(Dat_Arr[i+2],Dat_Arr[i+3])); // Экг
    Application.ProcessMessages;
    end;
    //
  inc(i,4);
  if S_STOP=TRUE then goto STOP_TR;
  end;
    STOP_TR:
    Series1.Clear;
    Series2.Clear;
    Chart1.BottomAxis.Minimum:=0;
    Chart1.BottomAxis.Maximum:=10;
    Chart2.BottomAxis.Minimum:=0;
    Chart2.BottomAxis.Maximum:=10;
    ProgressBar1.Position:=0;
    Button2.Enabled:=False;
    Button3.Enabled:=True;
end;
Nigadyai вне форума Ответить с цитированием
Старый 24.05.2010, 18:15   #2
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

UP.

Вопрос всё еще актуален... Надеюсь найдется знающий человек...

Программа упрощена.

Код:
// старт "передача"
procedure TMainForm.Button1Click(Sender: TObject);
label STOP_TR;
begin
Button3.Enabled:=False;
Button2.Enabled:=True;
Button1.Enabled:=False;
i:=Dat_Start;
ProgressBar1.Min:=0;
ProgressBar1.Max:=Dat_Stop-Dat_Start;

S_STOP:=FALSE;
  while i<=Dat_Stop do begin
    Vacomm1.WriteText(ansichar(b));
    Vacomm1.WriteText(ansichar(e));
    Vacomm1.WriteText(ansichar(Dat_Arr[i]));
    Vacomm1.WriteText(ansichar(Dat_Arr[i+1]));
    Vacomm1.WriteText(ansichar(Dat_Arr[i+2]));
    Vacomm1.WriteText(ansichar(Dat_Arr[i+3]));
    sleep(5);
    inc(i,4);
    ProgressBar1.Position:=ProgressBar1.Position+4;
    Application.ProcessMessages;
    if S_STOP=TRUE then goto STOP_TR;
  end;
    STOP_TR:
    ProgressBar1.Position:=0;
    Button2.Enabled:=False;
    Button3.Enabled:=True;
end;
При попытке переместить форму по экрану, цикл while "подвисает" на это время.
Nigadyai вне форума Ответить с цитированием
Старый 24.05.2010, 18:24   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а вы знаете, что таймер - это простейший вариант потока, собственно реализуйте передачу в потоке (это уже не про таймер), но с учетом baudrate в Vacomm1...thread ...наилучший вариант, если в ответ хоть что-то с com-порта, тогда проще и можно организовать с ожиданием ответа и посылкой следующей команды из буфера (буфер - это ваш набор команд) ...предугадывая вопрос о примере - напомню, что есть кнопочка "поиск"
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 26.05.2010, 11:39   #4
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

Спасибо, простые шаблоны нашел, вроде суть понял.
Такой еще вопрос:
Наблюдался вылет из цикла while при сворачивании формы. Поток сможет решить и эту проблему?
Nigadyai вне форума Ответить с цитированием
Старый 26.05.2010, 11:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В каком смысле "вылет"? Программа на ошибку падает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2010, 17:18   #6
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

"Вылет" - в смысле выходит из цикла.
То есть переходит сразу сюда:
Код:
    STOP_TR:
    ProgressBar1.Position:=0;
    Button2.Enabled:=False;
    Button3.Enabled:=True;
Nigadyai вне форума Ответить с цитированием
Старый 26.05.2010, 22:13   #7
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

моя первая попытка поработать с потоком...


Вот код:

Код:
{Определение класса TDataThread}
type
   TStartThread = class(TThread)
   private
     { Private declarations }
   protected
     procedure Work;
     procedure Execute; override;
   end;

var
  MainForm: TMainForm;
  i,j,count:                  integer;
  //
  S_Path,P_Path,F_Path:       string;
  S_File,P_File,F_File:       file;
  S_Size,P_Size,F_Size:       longint;
  S_Arr,P_Arr,F_Arr:          array of byte;
  S_Time,P_Time,F_Time:       integer;
  STh:                        TStartThread;
  //
  implementation

  uses ComSettings;

{$R *.dfm}

procedure TStartThread.Execute;
begin
  Synchronize(Work);
end;

procedure TStartThread.Work;
var
com: TVaComm;
begin
    i:=1;
    while i<=S_Size do begin
      com.WriteText(ansichar(b));
      com.WriteText(ansichar(e));
      com.WriteText(ansichar(S_Arr[i]));
      com.WriteText(ansichar(S_Arr[i+1]));
      com.WriteText(ansichar(S_Arr[i+2]));
      com.WriteText(ansichar(S_Arr[i+3]));
      inc(i,4);
    end;
end;

procedure TMainForm.StartSendClick(Sender: TObject);
begin
Sth:=TStartThread.Create(False);
Sth.Priority:=tpNormal;
end;
Nigadyai вне форума Ответить с цитированием
Старый 26.05.2010, 22:40   #8
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

Сейчас проверил, проблема заключается в объявлении Vacomm в потоке.
Другие типичные задачи работают (типа скрыть/показать форму с задержкой).
Так как же правильно обраться к ком-порту в данной ситуации?
Nigadyai вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Искуственная отрисовка формы Alt Общие вопросы Delphi 6 11.03.2010 22:09
Моргает label при перемещении Maxs Компоненты Delphi 21 26.11.2009 19:57
Изменить курсор при перемещении формы Nester Общие вопросы Delphi 11 28.09.2009 18:29
Процедура при перемещении формы Alex Cones Общие вопросы Delphi 7 28.07.2009 09:11
Запоминание координат при перемещении формы Shouldercannon Общие вопросы Delphi 5 21.06.2009 23:11