Привет всем!
Среда laz4android, не могу никак запустить простой поток под Андроид. На телефон простенькие программы устанавливаются, работают. В lazarus под Windows работает. А здесь программа запускается, нажимаю на запуск потока, сразу вылетает. Куда копать? Второй день уже трачу, не могу понять что ему надо.
Задача простая, нажимаю на кнопку, должен запустится поток, в этом потоке он должен на форму в текствую метку вывести строку 'Rabotaet'.
{hint: Pascal files location: ...\Potok\jni }
unit unit1;
{$mode delphi}
interface
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, AndroidWidget, Laz_And_Controls;
type
{ TAndroidModule1 }
TAndroidModule1 = class(jForm)
Button1: jButton;
TextView1: jTextView;
procedure Button1Click(Sender: TObject);
private
{private declarations}
public
{public declarations}
end;
type
{ ShdkThread }
ShdkThread=class(TThread)
private
stroka: string;
procedure Show;
protected
procedure Execute; override;
end;
var
AndroidModule1: TAndroidModule1;
potok: ShdkThread;
implementation
{$R *.lfm}
{ ShdkThread }
procedure ShdkThread.Show;
begin
stroka:='Rabotaet';
AndroidModule1.TextView1.Text:=stroka;
end;
procedure ShdkThread.Execute;
begin
Synchronize(Show);
end;
{ TAndroidModule1 }
procedure TAndroidModule1.Button1Click(Sender: TObject);
begin
try
potok:=ShdkThread.Create(true);
potok.FreeOnTerminate:=true;
potok.Priority:=tpLower;
potok.Resume;
except
end;
end;
end.
Работа с потоками под Android
Модератор: Модераторы
-
dimonershov
- незнакомец
- Сообщения: 2
- Зарегистрирован: 22.02.2023 13:53:10
Попробуй сделать "канонический цикл".
То бишь :
Как показвает практика писать не замкнутый в цикл поток чревато даже там где нужно однократное исполнение процедуры в потоке .
То бишь :
Код: Выделить всё
procedure TMyThread.Execute;
begin
while (not Terminated) do
..
end;
end;
-
dimonershov
- незнакомец
- Сообщения: 2
- Зарегистрирован: 22.02.2023 13:53:10
Alex2013 спасибо, а решение было не простое. Вообще оказалось всё сложнее. В файле *.pas я убрал директивы:
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
В файл *.lpr тоже их убрал, но в модули добавил cthreads. Поток стал запускаться, но синхронизации с главным потоком не было. Как дальше оказалось, нужно было еще в главном потоке вызывать функцию checksynchronize(). Вызывал я её из события таймера. Мою тему подробно разобрали на https://forum.lazarus.freepascal.org/in ... 404.0.html, я там уже выложил рабочий исходник. Продолжаю дальше мучать Андроид =)
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
В файл *.lpr тоже их убрал, но в модули добавил cthreads. Поток стал запускаться, но синхронизации с главным потоком не было. Как дальше оказалось, нужно было еще в главном потоке вызывать функцию checksynchronize(). Вызывал я её из события таймера. Мою тему подробно разобрали на https://forum.lazarus.freepascal.org/in ... 404.0.html, я там уже выложил рабочий исходник. Продолжаю дальше мучать Андроид =)
