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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2008, 23:47   #11
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Вообщем вот накалякал... знаете вроде пашет все правда я не уверен что все верно написано, прошу проверить и подсказать как лучше и верней будет

Код:
  begin
    Thread.Enter;
    Thread.Execute;
    Thread.Leave;
  end;
Это Вы зря сделали. Критические секции ставятся на участки кода, которые могут из разных потоков конкурентно обращаться к одним и тем же объектам, данным, грубо говоря, а Вы весь поток в в них затолкали. Это ничего не дает: у каждого экземпляра класса своя критическая секция, про которую другие экземпляры не знают, соответственно толку от нее - 0.
B_N вне форума Ответить с цитированием
Старый 25.02.2008, 23:55   #12
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Убрал... все вроде работает и так тогда не понятно... зачем синхронизации VCL... что от нее, если я так же все вызываю, правда одна небольшая ошибка есть
Мдя... все-таки синхронизация нужна... как ее реализовать на api пока не понял... буду идти по коду TThread дальше посмотрим что выйдет

Последний раз редактировалось BOBAH13; 25.02.2008 в 23:59.
BOBAH13 вне форума Ответить с цитированием
Старый 26.02.2008, 00:20   #13
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
....тогда не понятно... зачем синхронизации VCL...
.......
.......как ее реализовать на api пока не понял...
Данные в VCL, насколько я помню, оформлены очень своеобразно и критическими секциями / семафорами / мутантами никак не перекрыты - разные потоки могут обращаться к свойствам той же формы, скажем к ее размерам, и читать / писать их по своему усмотрению. И хотя фунции GetWindowRect или SetWindowPos выполняются атомарно, за время подготовки этих данных внутри VCL возможна путаница. Классическое объяснение синхронизации выглядит примерно так:
Допустим, что у нас есть некая переменная Х и два потока А и Б.
Поток А выполняет следующее действие над Х:
Код:
if X < 100 then inc(X) else X := 0;
Поток Б делает следующее:
Код:
if X <> 0 then result := arg / X;
Таким образом, если Х не перекрыта критической секцией (для простых "целых" объектов и простых действий над ними есть еще целая куча Interlocked****** - функций) может случиться так, что поток А присвоит Х значение 0 уже после того, как Б сравнил Х с нулём, но еще до того, как последний приступил к делению. Со всеми вытекающими. Поэтому инициализируется критическая секция (Которую видят оба потока!) и код выглядит примерно так:
Поток А:
Код:
...............................
EnterCriticalSection(@CritSection);
if X < 100 then inc(X) else X := 0;
LeaveCriticalSection(@CritSection);
...............................
Поток Б:
Код:
...............................
EnterCriticalSection(@CritSection);
if X <> 0 then result := arg / X;
LeaveCriticalSection(@CritSection);
...............................
То есть, в критическую секцию замыкается именно фрагмент кода, работающий с "общей" переменной и если один поток вошел в секцию, другой, перед тем как тоже заняться этой же переменной, должен будет сначала дождаться, когда ее покинет первый поток. Отсюдаследует, что в критические секции желательно замыкать короткие и быстрые части кода, когда это возможно, по крайней мере.
B_N вне форума Ответить с цитированием
Старый 26.02.2008, 00:29   #14
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Дело в том... что в потоке грузиться xml файл потом он парситься и динамически сформированная html записуется в документ броузера... если выполнять синхронизацию процедур обработки в TThread все работает прекрасно, как и говорил на счет ехе, в длл лажа... щас пробую вроде выполняется... но броузера видать не устраивает т.к. он мне отображает черт знает что и какой выход... я пока незнаю
BOBAH13 вне форума Ответить с цитированием
Старый 26.02.2008, 00:34   #15
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Дело в том... что в потоке грузиться xml файл потом он парситься и динамически сформированная html записуется в документ броузера... если выполнять синхронизацию процедур обработки в TThread все работает прекрасно, как и говорил на счет ехе, в длл лажа... щас пробую вроде выполняется... но броузера видать не устраивает т.к. он мне отображает черт знает что и какой выход... я пока незнаю
Ну то есть разные потоки обрабатывают разные файлы, но результат хотят затолкать в одно и то же окно? Ну или в дочерние окна одного и того же окна?
B_N вне форума Ответить с цитированием
Старый 26.02.2008, 00:37   #16
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

нет вы не поняли... есть класс поток мой и TThread от них унаследованы два класса типа загрузчика файлов с инета в TStream и парсер xml ...у которого парметры создания указывают на броузер и на текст загруженный (xml), тобиш когда он начнет парсить xml и готовый html после парсинга пихать в броузер то потока который грузил текст уже не будет так что то куда он пихает или что он вообще делает не имеет значение... просто обойтись крит. секциями не получилось
BOBAH13 вне форума Ответить с цитированием
Старый 26.02.2008, 00:43   #17
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Ааа... Ну тогда просто надо первый поток после окончания парсинга петлить на WaitForSingleObject, к примеру, а во втором, когда он закончит, выставлять какой-нибудь евент, которого ждёт первый, через SetEvent, пока я так понял ситуацию...
B_N вне форума Ответить с цитированием
Старый 26.02.2008, 00:57   #18
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

То BOBAH13
Мне кажется, идея с самого начала несколько неправильная - форму "запихивать" в DLL...
Они, в принципе, не для этого предназначались.
Ну, "запихните" туда функции... Из тех, что часто использовать будете...
Я как-то делал такую "байду" (заказали именно так, "понимаш") - в принципе, вся прога получилась в DLL, оставил последователям исходники - до сих пор звонят - спрашивают (а уж 6 лет прошло)... Нетолковое это дело...
mihali4 вне форума Ответить с цитированием
Старый 26.02.2008, 01:01   #19
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Мне кажется, идея с самого начала несколько неправильная - форму "запихивать" в DLL...
Вот об этом и речь. Причем если обычные окна на чистом winapi "закручиваются" в dll элементарно, то что там будет VCL вытворять - без отладчика не разберёшься.
B_N вне форума Ответить с цитированием
Старый 26.02.2008, 08:58   #20
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну и какой же выход? т.к. у меня в проекте плагины все содержат формы, а один вообще содержит список форм куда мен их пихать то ? а VCL юзать полюбому надо...
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки AidarBik Win Api 2 04.08.2008 10:00
Потоки в Delphi frai Общие вопросы Delphi 4 13.01.2008 03:39
Потоки в С Raptor Помощь студентам 1 07.01.2008 21:12
Потоки и объекты OrdJONY Общие вопросы Delphi 3 28.11.2007 21:59