Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 929

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, эксперты! Помогите разобраться. Создаю дополнительный поток для вывода информации на экран. В ХР все работает, а в Win98 выдает ошибку thread Error Параметр задан неверно (87). Что надо сделать, чтобы прога работала в Win98?

ymb62 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: ymb62 (статус: Посетитель)
Вопрос отправлен: 18 сентября 2007, 13:47
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 18 сентября 2007, 16:53; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 18 сентября 2007, 14:15 [#1]:

Если хотя бы код привели...
Но могу предположить, что есть проблемы с синхронизацией, так как вы пишете "для вывода на экран"
Галочка "подтверждения прочтения" - вселенское зло.
ymb62

ymb62 (статус: Посетитель), 18 сентября 2007, 15:09 [#2]:

Код модуля потока:

unit uThread;

interface

uses
Classes;

type
ThreadDisplayData = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

implementation


uses uMain;

procedure ThreadDisplayData.Execute;
begin

Synchronize(FMain.DataOnScreen);

end;

end.

Код модуля DataOnScreen:

procedure TFMain.DataOnScreen;
var
i,j: integer;
begin

EdFreq.Text:=FormatFloat(\'#####0.####\',MomentFreq);

for i:=20 downto 2 do
for j:=1 to 21 do
begin
SGData.Cells[j,i]:=SGData.Cells[j,i-1];
end;

SGData.Cells[1,1]:=FormatFloat(\'#########0\',vSec);
SGData.Cells[2,1]:=FormatFloat(\'##0.#######\',vFracSec);
SGData.Cells[3,1]:=FormatFloat(\'#####0.####\',MomentFreq);

for j:=1 to 6 do
begin
SGData.Cells[j*2+2,1]:=FormatFloat(\'#####0.###\',MomentVal[j].Re);
SGData.Cells[j*2+3,1]:=FormatFloat(\'#####0.###\',MomentVal[j].Im);
end;

for j:=16 to 21 do
begin
SGData.Cells[j,1]:=FormatFloat(\'#####0.###\',MomentK[j-15]);
end;

UaUbEtEdit.Text:=FormatFloat(\'#####0.###\',
Abs(CAngle(MomentVal[1],
MomentVal[2])*180/pi));
UbUcEtEdit.Text:=FormatFloat(\'#####0.###\',
Abs(CAngle(MomentVal[2],
MomentVal[3])*180/pi));
UcUaEtEdit.Text:=FormatFloat(\'#####0.###\',
Abs(CAngle(MomentVal[3],
MomentVal[1])*180/pi));

UaIaEtEdit.Text:=FormatFloat(\'#####0.###\',
Abs(CAngle(MomentVal[1],
MomentVal[4])*180/pi));
UbIbEtEdit.Text:=FormatFloat(\'#####0.###\',
Abs(CAngle(MomentVal[2],
MomentVal[5])*180/pi));
UcIcEtEdit.Text:=FormatFloat(\'#####0.###\',
Abs(CAngle(MomentVal[3],
MomentVal[6])*180/pi));
EdUa.Text:=FormatFloat(\'#####0.###\',
Sqrt(Sqr(MomentVal[1].Re)+Sqr(MomentVal[1].Im)));
EdUb.Text:=FormatFloat(\'#####0.###\',
Sqrt(Sqr(MomentVal[2].Re)+Sqr(MomentVal[2].Im)));
EdUc.Text:=FormatFloat(\'#####0.###\',
Sqrt(Sqr(MomentVal[3].Re)+Sqr(MomentVal[3].Im)));
EdIa.Text:=FormatFloat(\'#####0.###\',
Sqrt(Sqr(MomentVal[4].Re)+Sqr(MomentVal[4].Im)));
EdIb.Text:=FormatFloat(\'#####0.###\',
Sqrt(Sqr(MomentVal[5].Re)+Sqr(MomentVal[5].Im)));
EdIc.Text:=FormatFloat(\'#####0.###\',
Sqrt(Sqr(MomentVal[6].Re)+Sqr(MomentVal[6].Im)));

for i:=4 to 6 do
begin
MomentVal[i].Re:=MomentVal[i].Re*vKoefI;
MomentVal[i].Im:=MomentVal[i].Im*vKoefI;
end;

SerUIS.Clear;
VectDiagr(SerUIS,
MomentVal[1],
MomentVal[2],
MomentVal[3],
MomentVal[4],
MomentVal[5],
MomentVal[6]);

end;

Объекты редактирования находятся на разных страницах TPageControl.
Вадим К

Вадим К (статус: Академик), 18 сентября 2007, 15:19 [#3]:

смотря на код, могу сказать, что применение потоков в данном случае не даст никакого приимущества. так как код, который вызывается процедурой Synchronize выполняется в основном потоке. тоесть, говоря простым языком, после запуска дополнительного потока, он (доппоток) отдаёт управление основному потоку и ждёт выполнение кода, после чего опять назад возвращает управление доппотоку, который тут же завершается.
А вот неработать может по множеству причин. наиболее вероятная - у вас в коде где то происходит исключение (а в потоках оно по умолчанию не перехватывается). Поток умирает. и имеете ваше сообщение.
Тоесть для начала выкиньте поток и отладте процедуру без потоков. Так же не забудьте о секциях try - except
Галочка "подтверждения прочтения" - вселенское зло.
ymb62

ymb62 (статус: Посетитель), 18 сентября 2007, 15:57 [#4]:

- но в ХР-то это работает.

- и без потоков все работает и в ХР, и в Win98.

- Во всех примерах пишут, что программный текст потоков находиться в процедурах основного модуля, а в модуле потока только вызов этих процедур через Synchronize.

-можно ли программный текст процедуры обновления элементов редактирования главной формы перенести в модуль доппотока? будет-ли тогда доппоток выполняться независимо?
(хотя на однопроцессорной машине это все-равно псевдонезависимость)
Вадим К

Вадим К (статус: Академик), 18 сентября 2007, 16:12 [#5]:

>>- но в ХР-то это работает.
98 и XP устроены по разному.
>>- и без потоков все работает и в ХР, и в Win98.
Логично, значит проблема всё таки в потоках.
>>- Во всех примерах пишут, что программный текст потоков находиться в процедурах основного модуля, а в модуле потока только вызов этих процедур через Synchronize.
Не совсем верно читаете. Через Synchronize вызывается только код, который изменяет компоненты на формах. остальной (например расчётный) код спокойно может жить в потоке.
В целом я не рекомендовал процедуру Synchronize. Уж очень большой это костыль.
>>-можно ли программный текст процедуры обновления элементов редактирования главной формы перенести в модуль доппотока? будет-ли тогда доппоток выполняться независимо?
Нельзя. Обновление компонентов должно происходить только с основного потока.
Галочка "подтверждения прочтения" - вселенское зло.
ymb62

ymb62 (статус: Посетитель), 18 сентября 2007, 16:32 [#6]:

>>98 и XP устроены по разному.
Значит дело не только в потоках.

Как же тогда разделить первоочередные и второстепенные задачи?

Расчет - первоочередная задача. Получаю данные, расчитываю, отправляю.
Если остается время вывожу на экран, но при выводе на экран может поступить новая порция данных надо прервать вывод на экран и начать обработку.
Вадим К

Вадим К (статус: Академик), 18 сентября 2007, 16:37 [#7]:

Дело как раз в потоках

Идея правильная должна быть где то такая. Поток сидит и ждёт данных. как только они пришли, он выставляет себе высокий приоритет и начинает считать. а когда результат уже какой то есть, то делает посылку сообщения в основной потом, мол обновить можно данные
Галочка "подтверждения прочтения" - вселенское зло.
ymb62

ymb62 (статус: Посетитель), 18 сентября 2007, 16:47 [#8]:

ОК, попробую сделать так. Спасибо за информацию.

Есть вопрос на другую тему, можно ли его здесь задать или оформить в виде отдельного вопроса?
Вадим К

Вадим К (статус: Академик), 18 сентября 2007, 16:53 [#9]:

если на другую тему - в другом вопросе. Один вопрос - одна тема.
А также на досуге помедетируйте над следующим моим опусом
Скачиваем файлы из интернета
Хотя там и о скачке файлов говориться, но там также раскрываются некоторые аспекты по работе с потоками
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.02 сек.