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

Вниз

Использование CreateThread в Delphi   Найти похожие ветки 

 
vertal ©   (2004-06-18 15:26) [0]

Я создаю через CreateThread поток в своем процессе , и вручную устанавливаю IsMultiThread в True.Однако в этом потоке я не могу присваивать значение строкам(динамическим).Грубо говоря , когда пишу

Var
 SomeStr,SomeAnotherStr:String;
 ...
Begin
 SomeStr:=SomeAnotherStr;
 ...

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


 
VMcL ©   (2004-06-18 15:28) [1]

BeginThread()
?


 
Тимохов ©   (2004-06-18 15:37) [2]

не думаю, что ошибку надо искать тут, ошибка в другом


 
vertal ©   (2004-06-18 15:45) [3]

Не понял , что BeginThread()?
В справке по winapi :
A thread that uses functions from the C run-time libraries should use the beginthread and endthread ...
Я так понимаю ,что beginthread и endthread не определены в winapi ,и вообще ,причем здесь C ?


 
vertal ©   (2004-06-18 15:49) [4]

>не думаю, что ошибку надо искать тут, ошибка в другом
Если перед запуском потока поставить SetLength(SomeStr,MAX_PATH)
,а в потоке вместо

 SomeStr:=SomeAnotherStr;

написать

 Move(PCHar(SomeAnotherStr)^,PCHar(SomeStr)^,Length(SomeAnotherStr)+1);

и работать с SomeStr как с PCHar , то работа FindNext как ни странно , не нарушается.


 
Cobalt ©   (2004-06-18 15:53) [5]

1) Код твоей процедуры-потока приведи
2) Var
SomeStr,SomeAnotherStr:String;
...
Begin
SomeStr:=SomeAnotherStr;

- Это откуда? Из потока присваивается? Как объявлены структуры для FindNext? Код присваивоения им значений?


 
Тимохов ©   (2004-06-18 15:57) [6]


> и работать с SomeStr как с PCHar , то работа FindNext как
> ни странно , не нарушается.

вы думаете это доказательство?

приведите больше кода: как запускаете поток, фунцию потока ...


 
Игорь Шевченко ©   (2004-06-18 16:07) [7]


> и вручную устанавливаю IsMultiThread в True.


Зачем ?

"IsMultiThread is set to True by BeginThread in order to allow the memory manager to execute safely if a VCL application has more than one thread. If a second thread attempts to allocate memory, it is blocked until the first thread exits the memory manager."


 
vertal ©   (2004-06-18 18:50) [8]

Я вручную устанавливаю IsMultiThread в True потому , что читал в какой-то книжке по Dephi , что менеджер памяти в Delphi будет корректно работать , если запущено несколько потоков , только если IsMultiThread=True , а запуская поток через api - CreateThread из kernel32.dll , а не через класс TThread , я по-моему  должен поставить IsMultiThread=True.
Я сейчас поэкспериментировал с тем кодом и выяснил : FindNext и CreateThread по большому счету ни при чем. Там происходит выход из цикла с FindNext из-за того , что портится значение одной строковой переменной (SomeAnotherStr), которая не должна меняться(так).А портится она из-за того , что после присваивания

 SomeStr:=SomeAnotherStr;

оказывается , что

LongInt(PCHar(SomeStr))-LongInt(PCHar(SomeAnotherStr))=0

Это нормально???Строки ведь должны физически копироваться!!
Это я глючу или компилятор??


 
Тимохов ©   (2004-06-18 18:57) [9]


> Я вручную устанавливаю IsMultiThread в True потому , что
> читал в какой-то книжке по Dephi , что менеджер памяти в
> Delphi будет корректно работать , если запущено несколько
> потоков , только если IsMultiThread=True , а запуская поток
> через api - CreateThread из kernel32.dll , а не через класс
> TThread , я по-моему  должен поставить IsMultiThread=True.

абсолютно верно.

> Это нормально???Строки ведь должны физически копироваться!!

начну издалека.
в дельфи есть несколько типов с управляемым (компилятром) временем жизни:
1. СТроки
2. Дин массивы
3. Интерфейсы.
Есть еще, но не суть.

Все это указатели.
При присваивании одного другому в любом случае происходит копирование указателя с увеличением счетчика ссылок. Но нальше для строки и дин массивов все по-разному. Если в копии строки поменять значение, то строка скопируется в другое место со счетчиком ссылок 1, у старой строки счетчик уменьишстя на 1. У дин массивов такого нет - меняшь в копии, меняешь в оригинале.

Вообще то это все в хелпе описано в разделе object pascal reference.

Т.о. глючите вы.


 
VMcL ©   (2004-06-18 18:57) [10]

>>vertal ©  (18.06.04 18:50) [8]

>Строки ведь должны физически копироваться!!

Длинные строки не должны. Читай справку/книгу.


 
Тимохов ©   (2004-06-18 19:01) [11]


> vertal ©   (18.06.04 18:50) [8]

если вам нужно заставить строки скопироваться, то используйте uniquestring


 
panov ©   (2004-06-18 19:01) [12]

А может все-таки кусок кода привести?
Ну так... на всякий случай - вдруг еще не все поняли логику работы программы.


 
vertal ©   (2004-06-18 20:43) [13]

Речь идет о динамических дельфийских строках , о чем я по-моему сразу сказал.В справке сказано , что при присваивании происходит физическое копирование.Чаще всего так и есть.
Я  понял .Это ребята из борланда дооптимизировались, мля.Суть в том , что при присваивании значения строке физически она копируется только тогда , когда компилятор считает , что ее копия может быть изменена. Если копия будет изменяться как PChar , то компилятор не обратит на это внимание.Вот пример:

{$APPTYPE CONSOLE}
Var
s,t:String;
Begin
s:="1";
t:=s;
t[1]:="2";
//Pchar(t)[0]:="2";
writeln(LongInt(PCHar(s))-LongInt(PCHar(t)),":",t,"-",s);
End.

Если закомментировать строку "t[1]:="2";" вместо "Pchar(t)[0]:="2";" , то writeln напишет "0:2-2".
Я в своей программе слишком буквально полагался на справку(там дело в вызове CharToOEM(Pchar(SomeStr),PCHar(SomeStr))).


 
Игорь Шевченко ©   (2004-06-18 21:24) [14]


> Я  понял .Это ребята из борланда дооптимизировались


Вряд ли проблема в ребятах из Borland.


 
vertal ©   (2004-06-18 21:45) [15]

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


 
Тимохов ©   (2004-06-21 11:17) [16]


> vertal ©   (18.06.04 21:45) [15]
В справке сказано , что при присваивании происходит физическое копирование

врете.

супер вешь - object pascal reference (раздел шлатного хелпа). Там есть все о паскале, который лежит в основе дельфи.



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

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

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1090096862
Журавлёв Антон
2004-07-18 00:41
2004.08.01
Здраствуйте! У меня проблема с кодировками


6-1086073893
Stop
2004-06-01 11:11
2004.08.01
idTCPServer, idTCPClient


4-1088081733
Дэвид
2004-06-24 16:55
2004.08.01
Реестр ?, инсталяция!


14-1089964830
Dmitriy O.
2004-07-16 12:00
2004.08.01
Референдум


14-1089974061
Депрессирующий Человек
2004-07-16 14:34
2004.08.01
Программизм -> импотенция, геморрой :(





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский