Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.01.26;
Скачать: [xml.tar.bz2];

Вниз

Куча вопросов. Очищение объектов. Потоки.   Найти похожие ветки 

 
Вова   (2013-03-24 01:59) [0]

1) Что будет если 2 потока одновременно попытаются прочитать один и тот же массив (который в основном потоке), ничего в нем не меняя, просто найти там коечто.

2) Что нужно удалять при уничтожении экземпляра класса(в деструкторе):
а) нужно ли удалять данные с типом Record(внутри переменные типа string)? и если да, то как т.к. MyRecord := nil; вызывает ошибку несоответствия типов.
б) Нужно ли обнулять простые переменные (строки, числа, даты, булево), правда все кроме чисел  выдает ту же ошибку что и MyRecord.
в) Если я сделал размер массива нулевого размера, нужно ли обнулять указатель на него? MyMass := nil;

или все это удалится "само" при удалении экземпляра класса?

3) Как лучше организовать "общение" между потоками? Т.е. если несколько потоков желают, чтобы третий поток (как бы родительский) для них кое что сделал. Первоначальная идея была сделать стек в который все будут добавлять свой запрос, но тогда непонятно как к нему обращаться синхронизированно. Сейчас вот думаю, что если просьбы записывать в массив внутри потока - клиента, а тот поток что должен это сделать, будет бегать по потокам клиентам и собирать с них просьбы, а когда "клиент" увидит, что просьба выполнена (в родителе появится флаг), снимет флаг внутри себя. Но тогда получается, что потоку, который должен что то сделать придется тратить время на то, чтобы мониторить остальные потоки, как быть.

И это, если у меня класс TThread, но я не хочу, чтобы все его экземпляры запускались в отдельном потоке (т.к. их может быть более чем дофига, поэтому в отдельны поток хочется запихать только самые часто вызываемые и долго работающие) - как это сделать? заводить еще один такой же класс без TThread? И вообще сколько потоков максимум имеет смысл делать? Ну то есть, больше скольки потоков не имеет смысла делать )
Опять же если объект не в отдельном потоке, то кому то нужно запускать процедуру внутри него. Если несколько потоков вдруг попытаются ее одновременно вызвать - будет плохо, как быть? Делать еще один поток, который будет обходить остальные, искать в них флаг вызова, затем искать нужный экземпляр класса в основном потоке и запускать процедуру? )

Чую 4 ядра это вообще ниочем ))

как то так.....


 
Германн ©   (2013-03-24 02:30) [1]


>  Куча вопросов.

Ответы на "кучу вопросов" не следует искать на форумах!
Сначала нужно прочитать учебник.  И попробовать что-то сделать самому. Возможно решить примеры из учебника, если таковые там есть. А уж потом лезть на форум если что-то конкретное не понятно.


 
Inovet ©   (2013-03-24 06:30) [2]

> [1] Германн ©   (24.03.13 02:30)
> Сначала нужно прочитать учебник.

В прошлой ветке Вова сказал уже какой он пргрессивный - многа букаф не для него.


 
Podgoretsky   (2013-03-24 08:49) [3]

Что же тогда говорить про толстые книги?


 
Вова   (2013-03-24 09:08) [4]

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


 
Inovet ©   (2013-03-24 09:11) [5]

> [4] Вова   (24.03.13 09:08)

Нет, мы жадные и не хотим делиться знаниями из толстых книг.


 
Podgoretsky   (2013-03-24 09:22) [6]


> и теперь хотите отомстить чтоб другие тоже это сделали,
> а то как жеж.

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


 
Вова   (2013-03-24 09:37) [7]


destructor TStringList.Destroy;
var
 I: Integer;
 Temp: TArray<TObject>;
begin
 FOnChange := nil;
 FOnChanging := nil;

 // If the list owns the Objects gather them and free after the list is disposed
 if OwnsObjects then
 begin
   SetLength(Temp, FCount);
   for I := 0 to FCount - 1 do
     Temp[I] := FList[I].FObject;
 end;

 inherited Destroy;
 FCount := 0;
 SetCapacity(0);

 // Free the objects that were owned by the list
 if Length(Temp) > 0 then
   for I := 0 to Length(Temp) - 1 do
     Temp[I].Free;
end;


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


for I := 0 to FCount - 1 do
     FList[I].FObject.Free;


или тут тоже не пойму в чем тут смысл

procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;


 
Вова   (2013-03-24 10:02) [8]

Нет, мы жадные и не хотим делиться знаниями из толстых книг.

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


 
Inovet ©   (2013-03-24 10:04) [9]

> [8] Вова   (24.03.13 10:02)

Мы ещё ленивые и не хотим переписывать сюда ответы из книг. Ну ты же ленивый, вот и мы такие.


 
Вова   (2013-03-24 10:22) [10]

http://www.youtube.com/watch?v=QpEmYyK7RN4

"а я ведь все равно узнаю, что мне надо, потому что я профессионал..."

Тогда вам вообще нет смысла тут быть, потому что все что вы говорите написано в каких нибудь книгах.


 
bems ©   (2013-03-24 10:24) [11]

ололо


 
Podgoretsky   (2013-03-24 10:28) [12]

профессионал болтолог


 
Inovet ©   (2013-03-24 10:45) [13]

> [10] Вова   (24.03.13 10:22)
> Тогда вам вообще нет смысла тут быть, потому что все что вы говорите написано в каких нибудь книгах.

Быть вообще нет смысла, потому что все умрут.


 
oldman ©   (2013-03-24 11:39) [14]

Про какие толстые книги разговор, если он учебник русского языка не осилил?


 
Юрий Зотов ©   (2013-03-24 12:06) [15]

> Вова   (24.03.13 01:59)

> 1) Что будет если 2 потока одновременно попытаются прочитать один
>  и тот же массив ... ничего в нем не меняя

Все будет нормально.


> 2) Что нужно удалять при уничтожении экземпляра класса(в деструкторе):

Все ресурсы (память, хэндлы...), которые объект захватил динамически и которые больше в программе не нужны.


> а) нужно ли удалять данные с типом Record(внутри переменные типа string)?
> и если да, то как

Если память под запись была выделена динамически (причем лучше это делать через New), то надо (соответственно, через Dispose). Если же это статическая переменная, то не надо.


б) Нужно ли обнулять простые переменные (строки, числа, даты, булево),

Не нужно.


в) Если я сделал размер массива нулевого размера, нужно ли обнулять указатель на него? MyMass := nil;

Можно.


или все это удалится "само" при удалении экземпляра класса?

Не удалится


> 3) Как лучше организовать "общение" между потоками? Т.е. если несколько
> потоков желают, чтобы третий поток (как бы родительский) для них кое что
> сделал. Первоначальная идея была сделать стек в который все будут
> добавлять свой запрос, но тогда непонятно как к нему обращаться
> синхронизированно.

Через объект синхронизации. Например, через критическую секцию.

--------------------------

PS
А книжки читать все равно надо. Форумы их не заменят.


 
icWasya ©   (2013-03-25 09:49) [16]

или тут тоже не пойму в чем тут смысл

procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;


Смысл в том, что при вызове деструктора может произойти исключение. А так :
1) копируем указатель на объект во временную переменную. Может произойти ошибка, если в процедуру подали какой-нибудь адрес, с которого нельзя читать.
2) зануляем параметр. Может произойти ошибка, если в процедуру подали какой-нибудь адрес, в который нельзя писать.
В случае 1) и 2) у пользователя уже большие проблемы, и вызов деструктора уже не поможет.
3) вызываем деструктор у Temp. Вызов деструктора может выдать исключение, но если дошли до сюда, то пользовательская переменная уже обнулена.


 
DevilDevil ©   (2013-03-25 11:41) [17]

Ветку не читал

> 1) Что будет если 2 потока одновременно попытаются прочитать
> один и тот же массив (который в основном потоке), ничего
> в нем не меняя, просто найти там коечто.


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

> 2) Что нужно удалять при уничтожении экземпляра класса(в
> деструкторе):


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

> 3) Как лучше организовать "общение" между потоками?

не знай



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

Форум: "Начинающим";
Текущий архив: 2014.01.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.002 c
15-1374987146
TUser
2013-07-28 08:52
2014.01.26
Совсем закопирастились


15-1376356005
brother
2013-08-13 05:06
2014.01.26
IPTV на OpenWrt


2-1363956440
Сергей
2013-03-22 16:47
2014.01.26
Как подменить любой разделитель на точку


15-1375694754
NailMan
2013-08-05 13:25
2014.01.26
Свершилось!


15-1376080206
Юрий
2013-08-10 00:30
2014.01.26
С днем рождения ! 10 августа 2013 суббота





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский