Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #31  
Старый 18.03.2014, 09:33
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
а разве использование глобальной Form1 в потоке хороший тон?
Поскольку Form1 это не MyThread, и используется в Synchronize, то допустимо.
Ответить с цитированием
  #32  
Старый 18.03.2014, 09:39
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А я всё про CriticalSection. Я так и не услышал - что с чем синхронизируется с её помощью?
Если она используется только в одном потоке, то это не имеет смысла. А если обращение к Form1.ListBox, то обращение к форме нужно делать из под Synchronize. Например завести ещё один метод, в котором скопировать Form1.ListBox в StringList, а затем работать с этой копией.
Ответить с цитированием
  #33  
Старый 18.03.2014, 18:49
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

Цитата:
Сообщение от icWasya
Поскольку Form1 это не MyThread, и используется в Synchronize, то допустимо.
про недопустимость речи нет. а вот если сделать по правильному TMyThread в одельном модуле, то как быть? может все-таки передать потоку ссылки на объекты, которые он может/должен изменять...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #34  
Старый 19.03.2014, 05:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от icWasya
А я всё про CriticalSection. Я так и не услышал - что с чем синхронизируется с её помощью?

CriticalSection используется для синхронизации между потоками. Например, при доступе к общему ресурсу.

Вот такой примерчик. У тебя есть список строк и 2 потока, которые эти строки обрабатывают. Получение потоком очередной строки "оборачивается" в CriticalSection, что бы 2 потока не схватили одну и ту же строку.
Ответить с цитированием
  #35  
Старый 19.03.2014, 09:52
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
CriticalSection используется для синхронизации между потоками. Например, при доступе к общему ресурсу
Я вообще спрашивал у Автора, зачем CriticalSection именно в его коде.
Ответить с цитированием
  #36  
Старый 20.03.2014, 02:21
novashdima novashdima вне форума
Новичок
 
Регистрация: 05.02.2010
Адрес: Украина, Киев
Сообщения: 64
Версия Delphi: XE3, XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Я вообще спрашивал у Автора, зачем CriticalSection именно в его коде.
Потому как изначально в первых реализациях потоков у меня при нажатии на кнопку старт создавались новые потоки, поэтому это как дополнительная защита, что у меня не начнется вторая обработка одновременно.
Ответить с цитированием
  #37  
Старый 20.03.2014, 04:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от novashdima
Код:
procedure MyThread.Analys;
begin
.....
   for i := 0 to Form1.ListBox.Count - 1 do
.....
Так как метод MyThread.Analys выполняется в параллельном потоке, то нельзя вот так просто (без синхронизации) обращаться к объектам основного потока. Причём в подавляющем большинстве случаев этот код и будет скорее всего работать нормально, лишь изредка вызывая неожиданные сбои.

Цитата:
Сообщение от novashdima
Потому как изначально в первых реализациях потоков у меня при нажатии на кнопку старт создавались новые потоки, поэтому это как дополнительная защита, что у меня не начнется вторая обработка одновременно.
Конечно же критическая секция в этом месте заблокирует выполнение другого (случайно запущенного) параллельного потока, но что при этом будет с глобальной переменной AnalysThread? Ведь после второго нажатия на кнопку запуска в этой переменной уже будет указатель на объект другого (заблокированного) параллельного потока, и первый (работающий) параллельный поток используя эту переменную будет обращаться именно к заблокированному потоку, а не к самому себе, что должно было бы быть по задумке. Поэтому когда объект хочет обратиться к своим полям, методам и свойствам, нужно использовать вовсе не глобальную переменную, а специальную переменную Self, которую, в свою очередь, можно опускать.

p.s. Что-то я тут слишком много букв написал, надеюсь понятно свою мысль изложил
Ответить с цитированием
  #38  
Старый 20.03.2014, 05:15
novashdima novashdima вне форума
Новичок
 
Регистрация: 05.02.2010
Адрес: Украина, Киев
Сообщения: 64
Версия Delphi: XE3, XE4
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Так как метод MyThread.Analys выполняется в параллельном потоке, то нельзя вот так просто (без синхронизации) обращаться к объектам основного потока.
Спасибо, переделаю.
Цитата:
Сообщение от poli-smen
Конечно же критическая секция в этом месте заблокирует выполнение другого (случайно запущенного) параллельного потока, но что при этом будет с глобальной переменной AnalysThread? Ведь после второго нажатия на кнопку запуска в этой переменной уже будет указатель на объект другого (заблокированного) параллельного потока, и первый (работающий) параллельный поток используя эту переменную будет обращаться именно к заблокированному потоку, а не к самому себе, что должно было бы быть по задумке.
Хм... в общем-то идея была понята правильно, но по коду два раза начать обработку нельзя...
Цитата:
Сообщение от poli-smen
Поэтому когда объект хочет обратиться к своим полям, методам и свойствам, нужно использовать вовсе не глобальную переменную, а специальную переменную Self, которую, в свою очередь, можно опускать.
Ага, ну я уже итак везде поубирал "AnalysThread."
Цитата:
Сообщение от poli-smen
p.s. Что-то я тут слишком много букв написал, надеюсь понятно свою мысль изложил
Последние пару предложение поодиночке непонятны, но в общем все понятно
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter