Проблема с использованием потоков в Linux SLED sp10.2

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема с использованием потоков в Linux SLED sp10.2

Сообщение alexmai » 19.05.2009 21:05:08

Столкнулся с проблемой при использовании потоков Lazarus 0.9.27 в Linux
( код во вложении)
По виндой работает на ура, а пересобираю под linux слетает после пару записей
правда пришлось добавлять две строки чтобы собрать под LInux в файл проекта
иначе не компилился
program big_spoon;
{$mode objfpc}{$H+}
//********* кусок под линукс
{$DEFINE UNIX}
{$DEFINE UseCThreads}
//*****
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms
{ you can add units after this }, unitpass, unitgl, DBFLaz, MemDSLaz, unitopl,
zcomponent, SQLDBLaz, unitconf, unitlog, unitupdate;

begin
Application.Initialize;
Application.CreateForm(Tmainform, mainform);
Application.CreateForm(Tpassform, passform);
Application.Run;
end.


Поток определяю
TSyncThread = class(TThread)
private
Progress: integer;
procedure SetProgress;
procedure endpotok;
protected
procedure Execute; override;
end;

procedure TSyncThread.Execute;
begin
kol:=formupdate.readuser;
formupdate.ProgressBar1.Max :=kol;
formupdate.ProgressBar1.Step:=1;
mainform.tusers.Open;
mainform.tusers.First ;
ii:=0;
try
mainform.tranuserk.StartTransaction ;
while not mainform.tusers.EOF do
begin
ii:=ii+1;
formupdate.writeuser;
sleep(50);
Progress:=ii;
Synchronize(@SetProgress);
mainform.tusers.Next;
end;

ii:=0;
mainform.tranuserk.Commit ;
except
ii:=ii+1;
Application.MessageBox(PChar('Error '),PChar('Error'),MB_ICONERROR );
end;
Synchronize(@endpotok ) ;
end;
//**********************************
procedure TSyncThread.SetProgress;
begin
formupdate.ProgressBar1.Position:=Progress;
end;
procedure Tformupdate.SetProgressPos(var Msg: TLMessage);
begin
case Msg.WParam of
0: ProgressBar1.Position:=Msg.LParam;
end;
end;
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: Проблема с использованием потоков в Linux SLED sp10.2

Сообщение Mr.Smart » 19.05.2009 23:00:50

{$DEFINE UNIX}
{$DEFINE UseCThreads}
Эти определения необязательны если компилили под Linux (они определены поумолчанию).
Код либо сообщение ошибки можно увидеть? если есть...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема с использованием потоков в Linux SLED sp10.2

Сообщение VirtUX » 20.05.2009 09:47:46

Мне кажется Вам поможет следующее:
вместо
Код: Выделить всё
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}

закоментируем две строки в виде:
Код: Выделить всё
{$IFDEF UNIX}
//{$IFDEF UseCThreads}
cthreads,
//{$ENDIF}
{$ENDIF}

Если и так понятно, что приложение многопоточное, то зачем лишние проверки? :roll:
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Проблема с использованием потоков в Linux SLED sp10.2

Сообщение alexmai » 20.05.2009 12:19:48

VirtUX писал(а):Мне кажется Вам поможет следующее:
вместо
Код: Выделить всё
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}

закоментируем две строки в виде:
Код: Выделить всё
{$IFDEF UNIX}
//{$IFDEF UseCThreads}
cthreads,
//{$ENDIF}
{$ENDIF}

Если и так понятно, что приложение многопоточное, то зачем лишние проверки? :roll:


Вот ошибка во время отработки потока программа запущена из консоли
если не добавлены дые строчки в проект

This binary has no thread support compiled in.
Recompile the application with a thread-driver in the program uses clause before other units using thread.
Runtime error 232 at $0806F65C
$0806F65C
$08093985 TFORMUPDATE__BTNSTARTCLICK, line 167 of unitupdate.pas
$08160484 TCONTROL__CLICK, line 2103 of ./include/control.inc
$0817325F TBUTTONCONTROL__CLICK, line 63 of ./include/buttoncontrol.inc
$08173895 TCUSTOMBUTTON__CLICK, line 164 of ./include/buttons.inc
$08173DC1 TBUTTON__CLICK, line 320 of ./include/buttons.inc
$08093A12 TFORMUPDATE__FORMSHOW, line 185 of unitupdate.pas
$08079F1E TCUSTOMFORM__DOSHOW, line 738 of ./include/customform.inc
$08079818 TCUSTOMFORM__CMSHOWINGCHANGED, line 456 of ./include/customform.inc
$080694D9
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: Проблема с использованием потоков в Linux SLED sp10.2

Сообщение Mr.Smart » 20.05.2009 13:14:03

такое ощущение, что модуль cthreads в программе не подключен.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема с использованием потоков в Linux SLED sp10.2

Сообщение VirtUX » 20.05.2009 13:40:11

Попробуйте запустить у себя этот пример:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Проблема с использованием потоков в Linux SLED sp10.2

Сообщение alexmai » 22.05.2009 08:53:53

VirtUX писал(а):Попробуйте запустить у себя этот пример:

Запустил , все нормально.
У меня есть два подозрения
1. Я запускаю поток в методе Show другой формы с прогрссбаром, причем путем нажатия скрытой кнопки на этой форме которая в visible:=false
2.сервер жар-птицы использую классик, а у него свои потоки, которые могут и конфликтовать.
Просто когда поток ни с того ни ссего слетает, причем в разное время, то к такой реализации сразу же возникает отвращение.
alexmai
постоялец
 
Сообщения: 106
Зарегистрирован: 02.02.2009 14:58:42

Re: Проблема с использованием потоков в Linux SLED sp10.2

Сообщение VirtUX » 23.05.2009 16:27:58

alexmai писал(а):Просто когда поток ни с того ни ссего слетает, причем в разное время, то к такой реализации сразу же возникает отвращение.

У Вас скорее всего проблема с синхронизацией основного потока с дочерними, или может даже между дочерними потоками. Без сырцов тяжело угадать.
Попробуйте использовать "Критические секции", и обязательно предусмотрите передачу ресурса в дочерний поток из основного при длительных циклах с помощью Application.ProcessMessages;. Ну и другие методы синхронизации. Хотя мне хватает и этих способов (5-50 потоков в сервере и 3-7 потоков в клиентах).
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 50

Рейтинг@Mail.ru