Работа с потоками под Android

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

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

Работа с потоками под Android

Сообщение dimonershov » 22.02.2023 15:00:01

Привет всем!

Среда 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.
dimonershov
незнакомец
 
Сообщения: 2
Зарегистрирован: 22.02.2023 14:53:10

Re: Работа с потоками под Android

Сообщение Alex2013 » 23.02.2023 04:14:22

Попробуй сделать "канонический цикл".
То бишь :
Код: Выделить всё
procedure  TMyThread.Execute;
begin
while (not Terminated) do
..
end;
end;


Как показвает практика писать не замкнутый в цикл поток чревато даже там где нужно однократное исполнение процедуры в потоке .
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Работа с потоками под Android

Сообщение dimonershov » 26.02.2023 17:01:32

Alex2013 спасибо, а решение было не простое. Вообще оказалось всё сложнее. В файле *.pas я убрал директивы:

{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}

В файл *.lpr тоже их убрал, но в модули добавил cthreads. Поток стал запускаться, но синхронизации с главным потоком не было. Как дальше оказалось, нужно было еще в главном потоке вызывать функцию checksynchronize(). Вызывал я её из события таймера. Мою тему подробно разобрали на https://forum.lazarus.freepascal.org/in ... 404.0.html, я там уже выложил рабочий исходник. Продолжаю дальше мучать Андроид =)
dimonershov
незнакомец
 
Сообщения: 2
Зарегистрирован: 22.02.2023 14:53:10


Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 112

Рейтинг@Mail.ru