Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

Обращение к переменным в потоках   Найти похожие ветки 

 
cyborg ©   (2005-12-08 10:02) [0]

Создаю поток CreateThread, как в нём правильно работать с переменными, которые могут обрабатываться вне потока?


 
Reindeer Moss Eater ©   (2005-12-08 10:03) [1]

Аккуратно


 
cyborg ©   (2005-12-08 10:21) [2]

Блестать эрудицией принято в другом разделе.


 
Reindeer Moss Eater ©   (2005-12-08 10:22) [3]

А блистать именно в этом принято


 
cyborg ©   (2005-12-08 10:23) [4]

Ты заблуждаешься.


 
Reindeer Moss Eater ©   (2005-12-08 10:29) [5]

Вопрос внятный задай, умник. А БлЕстать или блЯстать дома будешь перед мамой.


 
cyborg ©   (2005-12-08 10:38) [6]

Слушай, у меня не входило в планы развлекаться или развлекать других в этой ветке. Умник. Читать научись. Написано по русски - "Как правильно работать с переменными в потоке?".  Иди развлекайся в другую тему.


 
Reindeer Moss Eater ©   (2005-12-08 10:44) [7]

Работают с трудными подростками, а обращаются к старшим по званию.

А у переменных просто читают занчения и присвают им значения.


 
Digitman ©   (2005-12-08 10:49) [8]


> cyborg ©   (08.12.05 10:38) [6]


> Как правильно


Если у тебя есть какие-то сомнения насчет "правильности" чего-то там, иллюстрируй их фрагментом своего кода с комментариями.


 
cyborg ©   (2005-12-08 10:53) [9]


> [8] Digitman ©   (08.12.05 10:49)

В потоке нужно добавлять строку к уже имеющейся строке. Понимаю, что нужно это дело как-то синхронизировать. Как и чем не знаю. Я ожидал здесь какую нибудь ссылку на статью или названия функций.

Но как нередко бывает пришёл остроум.


 
TUser ©   (2005-12-08 10:56) [10]


> В потоке нужно добавлять строку к уже имеющейся строке.

А другой поток (например, основной) может в это время к этой строке обращаться?


 
Reindeer Moss Eater ©   (2005-12-08 10:57) [11]

Остроум пришел потому что до него здесь нарисовался тугодум.

Используй TCriticalSection


 
Digitman ©   (2005-12-08 11:01) [12]


> cyborg ©   (08.12.05 10:53) [9]


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

Почему бы сразу не изложить вопрос хотя бы в форме [9] и упомянуть там "синхронизацию" ? Что, два слова сразу было трудно связать ?


> Как и чем не знаю


читай справку и MSDN про критические секции, их использование в дан.случае оправдано в качестве защиты данных от мультипоточных обращений


 
Defunct ©   (2005-12-08 11:17) [13]

> cyborg

один из возможных способов

TSomeClass = class(..)
..
private
  fSecuredString : String;
  procedure GetString:String;
  procedure SetString(const value: String);
public
  property SecuredString read GetString write SetString;
..
end

procedure TSomeClass.SetString;
begin
 CS.Aquire;
 try
    fSecuredString := value
 finally
    CS.Release
 end
end;

function TSomeClass.GetString;
begin
 CS.Aquire;
 try
    Result := fSecuredString
 finally
    CS.Release
 end
end;

где CS - TCriticalSection (unit SyncObjs) создается в конструкторе и уничтожается в деструкторе.


 
cyborg ©   (2005-12-08 11:20) [14]

>[10] TUser ©   (08.12.05 10:56)
Да.


> [12] Digitman ©   (08.12.05 11:01)
> Почему бы сразу не изложить вопрос хотя бы в форме [9] и
> упомянуть там "синхронизацию" ?

Потому, что я с прашивал В ОБЩЕМ по работе, а не конкретно со строкой или байтом.

Теперь можно отвлечься от темы и обсудить мой вопрос :)

Предложение "как в нём правильно работать с переменными" как бы подразумевает вопрос, как работать с различными данными в потоке, слово "правильно" подразумевает как положено, как это делают все, как нужно в конце концов. Не понимаю чего ещё тут можно увидеть кроме этого? Может кто тут про тапочки смысл углядел или про изготовление парового двигателя?

Может мне объяснить, какой другой смысл моего вопроса скрыт в этом тексте "Создаю поток CreateThread, как в нём правильно работать с переменными, которые могут обрабатываться вне потока?"?


> [11] Reindeer Moss Eater ©   (08.12.05 10:57)

Вот это другое дело. За это спасибо. Неужели в первом посте нельзя было написать?

Кстати http://delphimaster.net/view/15-1134026232/&web=1


 
Leonid Troyanovsky ©   (2005-12-08 11:20) [15]


> cyborg ©   (08.12.05 10:02)  
> Создаю поток CreateThread, как в нём правильно работать
> с переменными, которые могут обрабатываться вне потока?


Начать надо c BeginThread. Или TThread.
Ну, и

http://www.compress.ru/Common/Article/?1EFC4BF55D24E4C88304DF4771C16B4

--
Regards, LVT.


 
Reindeer Moss Eater ©   (2005-12-08 11:25) [16]

Потому, что я с прашивал В ОБЩЕМ по работе, а не конкретно со строкой или байтом.

Я так же не стал опускаться до частностей и дал общий ответ.
С переменными в потоках надо обходиться аккуратно.
И это вовсе не всегда предполагает обязательное исполльзование механизмов синхронизации.


 
Digitman ©   (2005-12-08 11:40) [17]


> cyborg ©   (08.12.05 11:20) [14]


> я с прашивал В ОБЩЕМ по работе, а не конкретно со строкой
> или байтом


На "общий вопрос" ты и получил "общий ответ" [1].
Не так уж и сложно было сообразить, что без конкретностей вопрос не имеет ни смысла ни ответа. И конкретности эти на данном этапе обсуждения ситуации вовсе не относятся к реальному типу тех переменных, которыми ты озаботился.


> Предложение "как в нём правильно работать с переменными"
> как бы подразумевает вопрос


Заметь - это ты подразумеваешь !) .. И почему ты считаешь, что подразумеваемое тобой столь же очевидно и любому другому человеку - вовсе непонятно.


> Может мне объяснить


От тебя это и требуется - конкретности ! Ибо общих рекомендаций и решений нет и быть не может - все зависит от конкретно поставленной тобой задачи.

И объяснишь, не поломаешься) ... За помощью в дан.случае, заметь, обратился именно ты - тебе и решать, как быстро ты получишь подробный ответ на столь же подробное изложение вопроса.

А все что от тебя требовалось - задать вопрос хотя бы в такой форме:

Два (или более) работающих потока одного и того же процесса потенциально способны одновременно обратиться к общим данным как по записи, так и по чтению... Чем это чревато и какие варианты синхронизации доступа к общим данным применимы/предпочтительны в тех или иных сабжевых ситуациях  ? Существуют ли общие решения ?


 
Leonid Troyanovsky ©   (2005-12-08 11:53) [18]


> Digitman ©   (08.12.05 11:40) [17]

> От тебя это и требуется - конкретности ! Ибо общих рекомендаций
> и решений нет и быть не может - все зависит от конкретно


Думаю, что по исходному вопросу достаточно конкретный ответ,
все же, возможен и звучит он примерно так:

Читать: Джефри Рихтер. "Windows для профессионалов", 4-е издание.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-12-08 11:56) [19]


> cyborg ©   (08.12.05 10:53) [9]

> В потоке нужно добавлять строку к уже имеющейся строке.


Напоминаю: BeginThread.
А лучше - TThread.

--
Regards, LVT.


 
cyborg ©   (2005-12-08 12:00) [20]


> [17] Digitman ©   (08.12.05 11:40)
> Два (или более) работающих потока одного и того же процесса
> потенциально способны одновременно обратиться к общим данным
> как по записи, так и по чтению... Чем это чревато и какие
> варианты синхронизации доступа к общим данным применимы/предпочтительны
> в тех или иных сабжевых ситуациях  ? Существуют ли общие
> решения ?

Так я не писал по причине, что я знаю чем это чревато и что должны существовать общие решения. Только не знаю какие, вот об этом и хотел узнать.

не кажется ли вам, что

какие варианты синхронизации доступа к общим данным применимы/предпочтительны

и
как в нём правильно работать с переменными, которые могут обрабатываться вне потока?

имеют одинаковый смысл, только слова разные?


 
cyborg ©   (2005-12-08 12:02) [21]


> [19] Leonid Troyanovsky ©   (08.12.05 11:56)

Спасибо, я через критикал сектион уже сделал.
Вопрос закрыт, ветку можно смело переносить в потрепаться :).


 
Digitman ©   (2005-12-08 12:11) [22]


> cyborg ©   (08.12.05 12:00) [20]


> должны существовать общие решения


Нет не должны.

А даже если и должны, то опять же конкретности требуюся - например, используется ли VCL, подразумеваются ли под переменными в т.ч. и переменные объектных типов, хранящие ссылки на виз.компоненты в составе VCL


> не кажется ли вам


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


 
Reindeer Moss Eater ©   (2005-12-08 12:19) [23]

какие варианты синхронизации доступа к общим данным применимы/предпочтительны
и
как в нём правильно работать с переменными, которые могут обрабатываться вне потока?

имеют одинаковый смысл, только слова разные?


Смысл не одинаковый, потому что у воторого вообще смысла нет.
Мне например нужно что бы запись в переменные не синхронизировалась и в переменных появлялся "мусор".
Надо и все тут.
Мне работать с критическими секциями - неправильно.


 
cyborg ©   (2005-12-08 12:20) [24]


> зато кажется другое - когда трудно изложить конкретную конечную
> задачу словами, следует приводить хотя бы наброски кода
> с пояснениями, где и какие сомнения в нем

Набросок кода у меня такой:

 S : String;

...

 S:=S+"123456";


поэтому никаких набросков я не приводил.


 
cyborg ©   (2005-12-08 12:25) [25]


>  [23] Reindeer Moss Eater ©   (08.12.05 12:19)
> Мне например нужно что бы запись в переменные не синхронизировалась
> и в переменных появлялся "мусор".
> Надо и все тут.

В чём проблема? Пиши, кто тебе не даёт?


 
Digitman ©   (2005-12-08 12:31) [26]


> Набросок кода у меня такой


а если бы был вот такой

var Form1: TMyForm;
...
Form1.Show;

то "общее решение" с крит.секциями - коту под хвост


 
Leonid Troyanovsky ©   (2005-12-08 12:39) [27]


> cyborg ©   (08.12.05 12:02) [21]

> Спасибо, я через критикал сектион уже сделал.


На здоровье.
Надеюсь, что с учетом [19].

--
Regards, LVT.


 
Reindeer Moss Eater ©   (2005-12-08 12:43) [28]

В чём проблема? Пиши, кто тебе не даёт?

Проблемы нет.
Есть бессмысленность термина "правильное обращение с переменными"


 
cyborg ©   (2005-12-08 13:14) [29]


> [27] Leonid Troyanovsky ©   (08.12.05 12:39)

Да, заменил.


 
Fay ©   (2005-12-08 13:24) [30]

2 Leonid Troyanovsky ©   (08.12.05 12:39) [27]

> А лучше - TThread.
Чем лучше?


 
Leonid Troyanovsky ©   (2005-12-08 13:55) [31]


> Fay ©   (08.12.05 13:24) [30]

> > А лучше - TThread.
> Чем лучше?


Проще: привычная объектная модель, готовый механизм синхронизации.
Сл-но, меньше ошибок.

BeginThread - для спартанских приложений, скажем, консолей.

--
Regards, LVT.


 
Fay ©   (2005-12-08 14:00) [32]

2 Leonid Troyanovsky ©   (08.12.05 13:55) [31]

> Проще: привычная объектная модель, готовый механизм
>синхронизации.
> Сл-но, меньше ошибок.

Может быть. А я до сих пор его (TThread) не понимаю.

> BeginThread - для спартанских приложений, скажем, консолей.
А CreateThread чем так провинился?


 
Leonid Troyanovsky ©   (2005-12-08 14:10) [33]


> Fay ©   (08.12.05 14:00) [32]

> > BeginThread - для спартанских приложений, скажем, консолей.
> А CreateThread чем так провинился?


Не устанавливает IsMultiThread :)
Да и про stdcall дельферы забывают.

--
Regards, LVT.


 
Fay ©   (2005-12-08 14:14) [34]

2 Leonid Troyanovsky ©   (08.12.05 14:10) [33]
Ясно. Действительно, это очень серьёзно 8).

На самом деле, я когда-то (не так давно) не ваще знал про IsMultiThread, а узнал только при обсуждении достоинств BeginThread 8)


 
Digitman ©   (2005-12-08 14:44) [35]


> Fay ©   (08.12.05 14:00) [32]


> до сих пор его (TThread) не понимаю


чтот конкретно не понимаешь ?


 
Fay ©   (2005-12-08 16:06) [36]

2 Digitman ©   (08.12.05 14:44) [35]
Ничего.
Когда встречаю чужой код c TThread(), никода не чувствствую уверенности в том, что точно понимаю логику программы.

Читал 100 раз про TThread (в книгах, в статьях). Везде примеры, слова о том, какой это полезный и удобный класс.
Но вот я не смог работать с потоками, пока не разобрался с CreateThread - нормальная понятная функция с понятными параметрами. И стало мне понимание и щястье.


 
Digitman ©   (2005-12-08 16:22) [37]


> Fay ©   (08.12.05 16:06) [36]


> встречаю чужой код c TThread(), никода не чувствствую уверенности
> в том, что точно понимаю логику программы


просто исх.текст Борланда нужно внимательно проштудировать ... там же, среди прочих вызовов, встретишь и свою CreateThread.


 
Digitman ©   (2005-12-08 16:22) [38]


> Fay ©   (08.12.05 16:06) [36]


> встречаю чужой код c TThread(), никода не чувствствую уверенности
> в том, что точно понимаю логику программы


просто исх.текст Борланда нужно внимательно проштудировать ... там же, среди прочих вызовов, встретишь и свою CreateThread.


 
Digitman ©   (2005-12-08 16:23) [39]


> Fay ©   (08.12.05 16:06) [36]


> встречаю чужой код c TThread(), никода не чувствствую уверенности
> в том, что точно понимаю логику программы


просто исх.текст Борланда нужно внимательно проштудировать ... там же, среди прочих вызовов, встретишь и свою CreateThread.


 
Fay ©   (2005-12-08 16:33) [40]

2 Digitman ©   (08.12.05 16:22) [37]
> там же, среди прочих вызовов, встретишь и свою CreateThread.

Было бы весьма занятно, если бы её там не оказалось 8)



Страницы: 1 2 вся ветка

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.047 c
14-1134725384
block
2005-12-16 12:29
2006.01.15
Не могу найти сайт про ВМВ


4-1131416118
msgipss
2005-11-08 05:15
2006.01.15
Можно ли получить время нахождения процесса в памяти


6-1127696360
Viktop
2005-09-26 04:59
2006.01.15
Монитор порта


8-1123374084
shadowgoga
2005-08-07 04:21
2006.01.15
Проиграть wav-файл "по кругу".


2-1135352750
kop
2005-12-23 18:45
2006.01.15
DBMemo