Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808

Мультипоточность OTL

23.03.2015, 18:56. Показов 3037. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сейчас я использую абстракцию Async-Await, но я не знаю, как правильно синхронизировать данные в Memo на главной форме. И еще проблемы возникают с завершение дополнительного потока, при завершении главного. (Да, я понимаю он все равно завершится, но при этом он может "наломать дров").

Исходник (вместе с OTL и XSuperObject): Audio Uploader.zip
Сама процедура:
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
procedure Upload(const Memo: TMemo; const OnStart, OnDone: TProc);
var
  Files: TStringList;
begin
  if user_id.IsEmpty or access_token.IsEmpty or Work then
    Exit;
  Files := TStringList.Create;
  if not ExecuteDialog(Files) then
  begin
    FreeAndNil(Files);
    Exit;
  end;
  OnStart;
  Work := True;
  Async(
    procedure
    var
      i: Integer;
      response1, response2, response3: string;
    begin
      for i := 0 to Files.Count - 1 do
      begin
        response1 := getUploadServer;
        if IsError(response1) then
          Memo.Lines.Add(ErrMessage(response1, Files[i]))
        else
        begin
          response2 := UploadAudio(response1, Files[i]);
          if IsError(response2) then
            Memo.Lines.Add(ErrMessage(response2, Files[i]))
          else
          begin
            response3 := SaveAudio(response2);
            if IsError(response3) then
              Memo.Lines.Add(ErrMessage(response3, Files[i]))
            else
              Memo.Lines.Add(Format(vkUploadSucess, [Files[i]]));
          end;
        end;
      end;
    end).Await(
    procedure
    begin
      FreeAndNil(Files);
      Work := False;
      OnDone;
    end);
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
var
  user_id, access_token: string;
  Work: Boolean = False;
 
resourcestring
  vkUploadFilter = 'Аудио MPEG Layer 3|*.mp3| Все файлы|*.*';
  vkBaseMethod = 'https://api.vk.com/method/';
  vkUploadError =
    'An error: "%s" occurred while uploading file with name: "%s"';
  vkUploadSucess = 'File "%s" has been successfully uploaded!';
  vkVersion = '5.29';
  vkAuthURL =
    'https://oauth.vk.com/authorize?client_id=4206083&redirect_uri=https://oauth.vk.com/blank.html&scope=17420&display=mobile&v=5.29&response_type=token';
 
implementation
 
function Get(const URL: string): string;
var
  HTTP: TIdHTTP;
begin
  Result := '';
  if not URL.IsEmpty then
  begin
    HTTP := TIdHTTP.Create(nil);
    try
      HTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
      Result := HTTP.Get(TIdURI.URLEncode(URL));
    finally
      FreeAndNil(HTTP);
    end;
  end;
end;
 
function Post(const URL, FileName: string): string;
var
  HTTP: TIdHTTP;
  MultiPart: TIdMultiPartFormDataStream;
begin
  Result := '';
  if not(URL.IsEmpty and FileName.IsEmpty) then
  begin
    HTTP := TIdHTTP.Create(nil);
    MultiPart := TIdMultiPartFormDataStream.Create;
    try
      HTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
      MultiPart.AddFile('file', FileName);
      Result := HTTP.Post(TIdURI.URLEncode(URL), MultiPart);
    finally
      FreeAndNil(HTTP);
      FreeAndNil(MultiPart);
    end;
  end;
end;
 
function ExecuteDialog(Files: TStringList): Boolean;
var
  Dialog: TOpenDialog;
begin
  Result := False;
  Dialog := TOpenDialog.Create(nil);
  try
    Dialog.Options := [ofFileMustExist, ofAllowMultiSelect];
    Dialog.Filter := vkUploadFilter;
    if Dialog.Execute then
    begin
      Files.Assign(Dialog.Files);
      Result := True;
    end;
  finally
    FreeAndNil(Dialog);
  end;
end;
 
function IsError(const AInput: string): Boolean;
begin
  Result := AInput.Contains('error');
end;
 
function ErrMessage(const AInput, AFileName: string): string;
begin
  Result := Format(vkUploadError, [SO(AInput)['error.error_msg'].AsString,
    AFileName]);
end;
 
function getUploadServer: string;
begin
  Result := Get(vkBaseMethod + 'audio.getUploadServer?access_token=' +
    access_token);
end;
 
function UploadAudio(const AInput, AFileName: string): string;
begin
  Result := Post(SO(AInput)['response.upload_url'].AsString, AFileName);
end;
 
function SaveAudio(const AInput: string): string;
var
  JSON: ISuperObject;
begin
  JSON := SO(AInput);
  Result := Get(vkBaseMethod + 'audio.save?v=' + vkVersion + '&access_token=' +
    access_token + '&user_id=' + user_id + '&server=' + JSON['server'].AsString
    + '&audio=' + JSON['audio'].AsString + '&hash=' + JSON['hash'].AsString);
end;
 
end.

Вызываю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TMainForm.Button1Click;
begin
  Upload(Memo1,
    procedure
    begin
      Status.Panels[1].Text := 'Загрузка';
    end,
    procedure
    begin
      Status.Panels[1].Text := '';
    end);
end;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2015, 18:56
Ответы с готовыми решениями:

Мультипоточность , работа с OLE объектами
Народ как боротся со след. проблемом? Короче, при начале создается ОЛЕ объект (Точнее 1С Апплкейшн) Обращение на хэндл 1С из...

Как подготовить лог OTL by oldtimer
Скачайте сканер OTL by OldTimer (или с зеркала) или OTL.com (или с зеркала) или OTL.scr (или с зеркала) и сохраните файл на вашем рабочем...

Мультипоточность С++
Была написана программа, а после этого пришли к выводу, что явным образом необходимо использование мультипоточности. Как ни странно,...

20
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
24.03.2015, 11:33
Лучший ответ Сообщение было отмечено Sigin как решение

Решение

Студворк — интернет-сервис помощи студентам
Да пофигу сигнальный токен или сигнальная переменная-флаг)

Сам код нити (в твоем случае это тело процедуры procedure(const task: IOmniTask)) должен периодически проверять состояние сигнала, и при обнаружении сигнального состояния процедура должна как можно быстрее завершить свое выполнение.
И чем чаще твоя процедура будет реагировать на изменение сигнала, тем лучше, тем быстрее завершится задание , тем быстрее твоя форма перестанет торчать)

Добавлено через 5 минут
У тебя есть минимум два вызова - UploadAudio() и ExecuteDialog(), - при выполнении которых твоя нить теряет возможность контроля состояния сигнала, поскольку внутренняя логика этих вызовов неподконтрольна нити задания.

Вот на них и следует в 1-ю очередь обратить внимание - придется переделывать, так чтобы то что творится внутри этих вызовов точно так же могло реагировать на сигнал терминации нити.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2015, 11:33

Мультипоточность?
Распространённая боль мультипоточности этот GIL, как я понял по гайдам... есть ли возможность в питоне его как то обойти или вроде того?...

Мультипоточность
Всем привет! Подскажите, пожалуйста! какой функцией лучше всего организовать много потоков в windows forms? И чтобы приоритеты...

PHP мультипоточность
Сегодня перешел на PHP с JAVA и C#. Нужна мультипоточность(НЕ МУЛЬТИПРОЦЕССНОСТЬ!)(в одном процессе). Всё что нашел сам было...

printf и мультипоточность
Как printf работает при нескольких потоках? То, что я знаю: printf пишет в буфер и при первой возможности выводит забуференное в...

Progress Bar и мультипоточность
Добрый день, имеется клас который достает данные с базы данных и генерит на их основе таблицу TableLayout, когда я его вызываю в onCreate()...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru