Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2014, 21:55   #1
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию IdThreadComponent синхронизация

Имеется некий поток, созданный на базе этого компонента. Внутри потока происходит загрузка графики из интернет. По окончании работы этого потока нужно вывести некую графическую информацию на дисплей. Если я из потока обращусь к процедуре вывода графики напрямую, то в ряде исключительных случаев (я так и не понял, в каких именно), получаю сбои в выводе графики (графика вылазит не там где нужно). Вопрос. Нужна ли синхронизация при работе с IdThreadComponent, и если да, как мне правильно обратится к процедуре синхронизации, и передать туда допустим строковые параметры?
P.S. Просьба не напоминать что:
1 - Инди это плохо.
2 - Что можно обойтись без инди.
doktor255 вне форума Ответить с цитированием
Старый 02.06.2014, 23:07   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Как обычно Синхронизация никуда не исчезает...
Код:
procedure TForm5.IdThreadComponent1Run(Sender: TIdThreadComponent);
begin
  Sender.Synchronize(procedure
  begin
    ShowMessage('YIIIIII IN THE MAIN THREAD....');
  end
  );
end;
P.S. Синтаксис съедобен. Это фича новых дельфей.
Человек_Борща вне форума Ответить с цитированием
Старый 02.06.2014, 23:23   #3
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Ну это понятно. А как быть с передачей параметров в процедуру? Через глобальные переменные? И мне не совсем удобно писать процедуру внутри обработчика, так как она сравнительно большая, и к тому же с ней работают и иные процедуры не относящиеся к потоку.

Последний раз редактировалось doktor255; 02.06.2014 в 23:29.
doktor255 вне форума Ответить с цитированием
Старый 02.06.2014, 23:45   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Попробуйте так:
Код:
procedure Run(Sender: ...);
var
  SyncVar_1:string;
 
  procedure Sync_proc;
  begin
  //Что-нибудь с SyncVar_1 здесь происходит...
  end;

begin
  SyncVar_1 := 'Happy coding...';
  Sender.Synchronize(Sync_proc);
end;
Человек_Борща вне форума Ответить с цитированием
Старый 03.06.2014, 01:23   #5
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Написал же, процедура вне обработчика, так как процедуру используют модули и основного потока... Ну не писать же мне две одинаковых здоровенных процедуры.
doktor255 вне форума Ответить с цитированием
Старый 03.06.2014, 01:39   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

doktor255, не суть это. Ваша процедура требует только параметры. Вот их и передавайте, а в методе синхронизации дергайте процедуру.
Человек_Борща вне форума Ответить с цитированием
Старый 03.06.2014, 01:56   #7
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Вот их и передавайте
Каким образом? Так что-ли?
Код:
procedure Run(Sender: ...);
var
  SyncVar_1:string;
 
  procedure Sync_proc;
  begin
    proc123(SyncVar_1);
  end;

begin
  SyncVar_1 := 'Happy coding...';
  Sender.Synchronize(Sync_proc);
end;

Последний раз редактировалось doktor255; 03.06.2014 в 02:00.
doktor255 вне форума Ответить с цитированием
Старый 03.06.2014, 10:22   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Да, только так )

TThreadmethod - метод без параметров.
Человек_Борща вне форума Ответить с цитированием
Старый 03.06.2014, 12:53   #9
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Да, только так )
Попробовал, не прокатило. Делфи топает ногами, и говорит что я делаю каку.
Цитата:
[dcc32 Error] DisplayLoader.pas(77): E2009 Incompatible types: 'method pointer and regular procedure'
в строке
Цитата:
sender.Synchronize(sync);
doktor255 вне форума Ответить с цитированием
Старый 03.06.2014, 13:00   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

procedure Synchronize(AMethod: TThreadMethod); overload;
procedure Synchronize(AMethod: TMethod); overload;

Parameters

AMethod: TThreadMethod

Thread or procedural method to be executed in the main thread.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация kuba1981 PHP 9 06.05.2013 11:39
Синхронизация БД Bright-rider БД в Delphi 3 19.06.2012 07:32
Синхронизация tesseract Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 20.03.2012 10:31
Синхронизация Jakethefish PHP 0 24.08.2011 11:17
Синхронизация kostyan142 Общие вопросы по Java, Java SE, Kotlin 6 13.01.2010 01:39