Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: FireMonkey
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
First
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 822
Записей в блоге: 3
1

Android и поток

23.03.2017, 02:17. Просмотров 1524. Ответов 4
Метки нет (Все метки)

Доброго времени суток. Делаю обновление таблицы в потоке. Но странность то работает то вылетает приложение. Может опытным взглядом скажите что ни так. Заранее очень благодарен.

Delphi
1
2
3
4
5
procedure TMyThread.Execute;
begin
  Form1.actSynchronizeExecute(Self);
  MyThread.Destroy;
end;
Delphi
1
2
3
4
5
procedure TForm1.StartUpdateClick(Sender: TObject);
begin
  MyThread := TMyThread.Create(False);
  MyThread.FreeOnTerminate := True;
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
procedure TForm1.actSynchronizeExecute(Sender: TObject);
var
  A: Integer;
  eng, rus, tran: string;
  id: Integer;
  str: TStringList;
  url, result: string;
  JSON: TJSONObject;
  JSONArray: TJSONArray;
  i: Integer;
  STRARRAY: string;
  colUpdateWord, colUpdateWordAll: Integer;
begin
  if Form1.statusNet.Text = 'off' then
  begin
    ShowMessage('Нет подключения!');
  end
  else
  begin
    Form1.startUdate.Enabled := False;
    STRARRAY := Form1.idhtp1.Get('http://192.168.0.102/php/selectWords.php');
    JSON := TJSONObject.ParseJSONValue(STRARRAY, True) as TJSONObject;
    JSONArray := TJSONArray(JSON.Get('words').JsonValue);
    colUpdateWord := 0;
    colUpdateWordAll := 0;
    Form1.fdqry1.SQL.Clear;
    Form1.fdqry1.SQL.Add('DELETE FROM words');
    Form1.fdqry1.ExecSQL;
    for i := 0 to JSONArray.Count - 1 do
    begin
      id := i;
      eng := TJSONPair(TJSONObject(JSONArray.Get(i)).Get('eng_word')).JsonValue.AsVariant;
      rus := TJSONPair(TJSONObject(JSONArray.Get(i)).Get('rus_word')).JsonValue.AsVariant;
      tran := TJSONPair(TJSONObject(JSONArray.Get(i)).Get('rus_word')).JsonValue.AsVariant;
      Form1.fdqry2.Active := False;
      Form1.fdqry2.Params.ParamByName('ENW').Value := eng;
      Form1.fdqry2.Active := True;
      if Form1.fdqry2.RecordCount = 0 then
      begin
        Form1.fdtblWordAppend.Append;
        Form1.fdtblWordAppend.FieldByName('code_word').AsInteger := id;
        Form1.fdtblWordAppend.FieldByName('eng_word').AsString := eng;
        Form1.fdtblWordAppend.FieldByName('tran_word').AsString := tran;
        Form1.fdtblWordAppend.FieldByName('rus_word').AsString := rus;
        Form1.fdtblWordAppend.Post;
        colUpdateWord := colUpdateWord + 1;
        Form1.addsWord.Text := 'Добавлено слов: ' + IntToStr(colUpdateWord);
      end
      else
      begin
        colUpdateWordAll := colUpdateWordAll + 1;
        Form1.skipsWord.Text := 'Пропущено слов: ' + IntToStr(colUpdateWordAll);
      end;
    end;
    Form1.startUdate.Enabled := True;
  end;
end;
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2017, 02:17
Ответы с готовыми решениями:

[android] Нет пункта Android Service
Всем привет! Пробую создать сервис для андроида на delphi XE7. В хелпе сказано добавить так: File...

Android и двоичный поток из 1с
Доброго времени суток, я опять с вопросом :) есть возвращаемое вебсервисом значение, двоичный...

RTMP поток и Android
Здравствуйте. Может кто сталкивался и знает, можно ли на Android воспроизводить rtmp-поток. И как...

Перегружен основной поток приложения на android
Помогите пожалуйста разобраться. Добавляю в pro файл QT += multimedia и даже без включения...

Android Thread поток не выходит из сна
Поток должен каждые 4 секунды выводить лог. Один раз выводит "Request", потом "try" и все. В чем...

4
krapotkin
4116 / 3432 / 1160
Регистрация: 14.04.2014
Сообщений: 16,452
Записей в блоге: 17
23.03.2017, 09:41 2
тут неправильно вообще все

поток не должен обращаться к формам и экрану вообще
поток не должен вызывать в Execute Destroy да еще и у конкретного объекта этого класса
поток не может вызывать ShowMessage/ т.к. еще раз - вся работа с экраном может быть только в главном потоке

Класс формы TForm1 не должен обращаться к конкретному экземпляру этого класса Form1

Добавлено через 3 минуты
Повтор string
0
First
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 822
Записей в блоге: 3
23.03.2017, 15:02  [ТС] 3
Как я понимаю в потоке я могу только разобрать JSON и сделать обновление таблицы? Но ни как не касаться формы?
0
krapotkin
4116 / 3432 / 1160
Регистрация: 14.04.2014
Сообщений: 16,452
Записей в блоге: 17
23.03.2017, 16:48 4
Лучший ответ Сообщение было отмечено First как решение

Решение

да
это самое то
1
First
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 822
Записей в блоге: 3
23.03.2017, 17:19  [ТС] 5
Цитата Сообщение от krapotkin Посмотреть сообщение
да
это самое то
Спасибо большое разобрался!
0
23.03.2017, 17:19
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2017, 17:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся.
В функции треда создал буфер char tbuf;но после того как тред выполнился выскочила ошибка...

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной...

Ошибка-Текущий поток должен быть задан как поток однопоточного контейнера STA
Значит модуль в нем классы.Я создаю свое гуи.Так вот при вызове процедуры котрая копирует текст(в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.