| 
| 
 | Вопрос # 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]:если на другую тему - в другом вопросе. Один вопрос - одна тема. А также на досуге помедетируйте над следующим моим опусом
 Скачиваем файлы из интернета
 Хотя там и о скачке файлов говориться, но там также раскрываются некоторые аспекты по работе с потоками
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |