Форум: "Начинающим";
Текущий архив: 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