Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];

Вниз

Виснет прога.   Найти похожие ветки 

 
Andrey K   (2009-09-06 17:35) [0]

Доброго времени суток. В основном модуле открываю поток TThread, кот. по необходимости, посредством ком порта, кидает на разные устройства данные. Поток, конечно же, синхронизирован с  основным модулем. Для контроля переданной инфы, сделан дополнительный объект, через свойство которого передаваемые данные кидаю в TStringList  , критичного пока ничего не происходит. Чтобы посмотреть переданные данные этот объект вызывает форму на кот. есть TMemo и туда вываливает все, что накопилось в TStringList  и в этот момент прога виснет. По первому предположению надо синхронизировать, но чего с чем? У меня пока ничего не получилось. Структура проги очень большая (создавалась несколько лет), и привести выдержки с последовательностью займут много места. Очень надеюсь, что кто-нибудь подскажет, куда копать.


 
Сергей М. ©   (2009-09-06 17:55) [1]


> чего с чем?


Уж точно не


> Поток.. с  основным модулем


Ибо галиматья.

Правило №1: обращение к методам и свойствам визуальных VCL-контролов следует осуществлять только в основном потоке процесса VCL-приложения.

Правило №2: Модули к потокам НЕ имеют НИ малейшего отношения.


 
Юрий Зотов ©   (2009-09-06 18:00) [2]

>  Чтобы посмотреть переданные данные этот объект вызывает
> форму на кот. есть TMemo и туда вываливает все, что накопилось
> в TStringList

А в этот момент поток продолжает что-то писать в этот же TStringList. Последствия непредсказуемы, но ничего хорошего точно не будет.

=============

1. При создании потока форма передает ему свой хэндл и поток запоминает этот хэндл в своем поле.

2. Поток не сам пишет данные, а через PostMessage посылает форме сообщение и в параметрах этого сообщения передает форме очередную порцию данных.

3. В обработчике этого сообщение форма добавляет полученную порцию данных прямо в Memo.

4. А TStringList и Ваш промежуточный объект получаются ненужными. И синхронизация не нужна. Тоь есть - не пишем лишний код, не усложняем программу, не тратим лишнюю память и не снижаем скорость.


 
Andrey K   (2009-09-06 22:17) [3]

Спасибо за совет. Попробую.


 
Юрий Зотов ©   (2009-09-06 22:45) [4]

> Andrey K   (06.09.09 22:17) [3]

Только имейте в виду, что буфер, в который поток УЖЕ записал порцию данных (и адрес которого он УЖЕ передал форме) должен отличаться от того буфера, в который поток СЕЙЧАС пишет новую порцию данных (готовя ее к передаче форме). Иначе потребуется синхронизация.

Например:

type
 TMyData = record
   ...
 end;
 PMyData = ^TMyData;

procedure TMyThread.Execute;
var
 P: PMyData;
begin
 while not Terminated do
 begin
   New(P);
   with P^ do
   try
     ... // Заполняем структуру нужными данными
     PostMessage(Form1Handle, My_Message, Integer(P), 0)
   except
     Dispose(P);
     raise
   end
 end
end;

procedure TForm1.MyMessage(var Message: TMessage);
var
 P: PMyData;
begin
 inherited;
 P := PMyData(Message.WParam);
 try
   with P^ do
   begin
     ... // Обрабатываем полученные данные (пишем в Memo, например)
   end
 finally
   Dispose(P)
 end
end;


 
DVM ©   (2009-09-06 23:03) [5]


> Только имейте в виду, что буфер, в который поток УЖЕ записал
> порцию данных (и адрес которого он УЖЕ передал форме) должен
> отличаться от того буфера, в который поток СЕЙЧАС пишет
> новую порцию данных (готовя ее к передаче форме). Иначе
> потребуется синхронизация.

Проще взять SendMessage


 
Юрий Зотов ©   (2009-09-06 23:35) [6]

> DVM ©   (06.09.09 23:03) [5]

И оконная процедура формы сработает в контексте второго потока.

"Последствия непредсказуемы, но ничего хорошего точно не будет" (c)
:o)


 
DVM ©   (2009-09-06 23:42) [7]


> И оконная процедура формы сработает в контексте второго
> потока.

НЕТ


 
DVM ©   (2009-09-07 00:07) [8]

Более того, в [4] описан подход не очень хороший.
Согласно [4] у нас память будет выделяться в одном потоке, а освобождаться должна в другом, что само уже по себе плохо. Кроме этого, если окажется, что второй поток память выделяет быстрее, чем первый освобождает (вполне реальная ситуация, когда первый поток должен как то обрабатывать принятые данные), то все может встать из-за нехватки памяти. И для решения этой проблемы мы опять придем к синхронизации. Кроме этого при постоянном выделении/освобождении память фрагментируется, что хоть и не критично, но не очень и хорошо.


 
Юрий Зотов ©   (2009-09-07 00:19) [9]

> DVM ©   (06.09.09 23:42) [7]

А ведь и верно. С этой Джавой начал подзабывать уже...
:o)

If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure.


 
Юрий Зотов ©   (2009-09-07 00:26) [10]

> Andrey K   (06.09.09 22:17) [3]

Значит, делаем очень простую синхронизацию:

type
TMyData = record
  ...
end;
PMyData = ^TMyData;

procedure TMyThread.Execute;
var
 Data: TMyData;
begin
 while not Terminated do
 begin
   ... // Заполняем структуру Data нужными данными
   SendMessage(Form1Handle, My_Message, Integer(@Data), 0)
 end
end;

procedure TForm1.MyMessage(var Message: TMessage);
var
 P: PMyData;
begin
 inherited;
 P := PMyData(Message.WParam);
 with P^ do
 begin
   ... // Обрабатываем полученные данные (пишем в Memo, например)
 end
end;


 
Игорь Шевченко ©   (2009-09-07 01:51) [11]


> Чтобы посмотреть переданные данные этот объект вызывает
> форму на кот. есть TMemo и туда вываливает все, что накопилось
> в TStringList  и в этот момент прога виснет


StringList небось большой...


 
Германн ©   (2009-09-07 02:14) [12]


> В основном модуле открываю поток TThread, кот. по необходимости,
>  посредством ком порта, кидает на разные устройства данные.
>

Ну даже надоело отвечать.
На кой хрен тут TThread с синхронной работой с COM-портом?


 
AIK ©   (2009-09-07 08:53) [13]


> Andrey K   (06.09.09 17:35)  


кот наверное чёрный, смени на любой другой цвет
черные коты неприятности приносят )))


 
Anatoly Podgoretsky ©   (2009-09-07 09:20) [14]

> AIK  (07.09.2009 08:53:13)  [13]

Нифига себе, перекрашивать кота, перекисью наверно, а он переживет?


 
Andrey K   (2009-09-07 16:46) [15]

Спасибо за советы. Вопрос то я кинул, а заняться им некогда. Чуть попозже попробую. О результате обязательно сообщу.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.11.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
1-1222415367
Gurd
2008-09-26 11:49
2009.11.01
Маска ввода в StringGrid с помощью KeyPress


2-1252269484
indiegod
2009-09-07 00:38
2009.11.01
Уничтожение динамического TImage


2-1252648119
Гость
2009-09-11 09:48
2009.11.01
Объявление переменной


2-1252403194
AReal
2009-09-08 13:46
2009.11.01
Как получить список всех компонентов расположенных на чужой форме


1-1222269356
@!!ex
2008-09-24 19:15
2009.11.01
Какие есть способы определения, нажата клавиша или нет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский