|
Вопрос # 929/ вопрос открыт / |
|
Здравствуйте, эксперты! Помогите разобраться. Создаю дополнительный поток для вывода информации на экран. В ХР все работает, а в Win98 выдает ошибку thread Error Параметр задан неверно (87). Что надо сделать, чтобы прога работала в Win98?
 |
Вопрос задал: ymb62 (статус: Посетитель)
Вопрос отправлен: 18 сентября 2007, 13:47
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 18 сентября 2007, 16:53; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 18 сентября 2007, 14:15 [#1]:
Если хотя бы код привели...
Но могу предположить, что есть проблемы с синхронизацией, так как вы пишете "для вывода на экран"
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Посетитель), 18 сентября 2007, 15:57 [#4]:
- но в ХР-то это работает.
- и без потоков все работает и в ХР, и в Win98.
- Во всех примерах пишут, что программный текст потоков находиться в процедурах основного модуля, а в модуле потока только вызов этих процедур через Synchronize.
-можно ли программный текст процедуры обновления элементов редактирования главной формы перенести в модуль доппотока? будет-ли тогда доппоток выполняться независимо?
(хотя на однопроцессорной машине это все-равно псевдонезависимость)
|
|
Вадим К (статус: Академик), 18 сентября 2007, 16:12 [#5]:
>>- но в ХР-то это работает.
98 и XP устроены по разному.
>>- и без потоков все работает и в ХР, и в Win98.
Логично, значит проблема всё таки в потоках.
>>- Во всех примерах пишут, что программный текст потоков находиться в процедурах основного модуля, а в модуле потока только вызов этих процедур через Synchronize.
Не совсем верно читаете. Через Synchronize вызывается только код, который изменяет компоненты на формах. остальной (например расчётный) код спокойно может жить в потоке.
В целом я не рекомендовал процедуру Synchronize. Уж очень большой это костыль.
>>-можно ли программный текст процедуры обновления элементов редактирования главной формы перенести в модуль доппотока? будет-ли тогда доппоток выполняться независимо?
Нельзя. Обновление компонентов должно происходить только с основного потока.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
ymb62 (статус: Посетитель), 18 сентября 2007, 16:32 [#6]:
>>98 и XP устроены по разному.
Значит дело не только в потоках.
Как же тогда разделить первоочередные и второстепенные задачи?
Расчет - первоочередная задача. Получаю данные, расчитываю, отправляю.
Если остается время вывожу на экран, но при выводе на экран может поступить новая порция данных надо прервать вывод на экран и начать обработку.
|
|
Вадим К (статус: Академик), 18 сентября 2007, 16:37 [#7]:
Дело как раз в потоках
Идея правильная должна быть где то такая. Поток сидит и ждёт данных. как только они пришли, он выставляет себе высокий приоритет и начинает считать. а когда результат уже какой то есть, то делает посылку сообщения в основной потом, мол обновить можно данные
Галочка "подтверждения прочтения" - вселенское зло.
|
|
ymb62 (статус: Посетитель), 18 сентября 2007, 16:47 [#8]:
ОК, попробую сделать так. Спасибо за информацию.
Есть вопрос на другую тему, можно ли его здесь задать или оформить в виде отдельного вопроса?
|
|
Вадим К (статус: Академик), 18 сентября 2007, 16:53 [#9]:
если на другую тему - в другом вопросе. Один вопрос - одна тема.
А также на досуге помедетируйте над следующим моим опусом
Скачиваем файлы из интернета
Хотя там и о скачке файлов говориться, но там также раскрываются некоторые аспекты по работе с потоками
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|