Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему зависает поток? 
:(
    Опции темы
UKRtortik
Дата 24.3.2014, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



Почему при старте зависает поток?

Код

procedure TNewThread.Execute;
var
StringList: TStringList;
RegExpr: TRegExpr;
HTTPSend: THTTPSend;
begin
HTTPSend := THTTPSend.Create;
StringList := TStringList.Create;
RegExpr := TRegExpr.Create;
RegExpr.Expression := '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}';
HTTPSend.HTTPMethod('GET', Site);
StringList.LoadFromStream(HTTPSend.Document);
if RegExpr.Exec(StringList.Text) then
repeat
Site := RegExpr.Match[0];
Synchronize(Reg);
until not RegExpr.ExecNext;
RegExpr.Free;
HTTPSend.Free;
StringList.Free;
end;
 
procedure TNewThread.Reg;
begin
  Form1.sMemo2.Lines.Add(Site);
end;

PM MAIL   Вверх
Poseidon
Дата 26.3.2014, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Откуда сведения о том, что зависает? Долго HTTPSend.HTTPMethod('GET', Site); обрабатывается? Так это нормально. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 14.4.2014, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



Poseidon, при старте программа полностю зависает секунд на 5-10, из-за чего?
PM MAIL   Вверх
CynicRus
Дата 14.4.2014, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Application.ProcessMessage попробуй. Из-за чего? Может из-за цикла, может из-за Get.

PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



А где именно должен быть Application.ProcessMessages?
PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



Код

SetLength(NewThread, sMemo1.Lines.Count);
for i := 0 to sMemo1.Lines.Count - 1 do
begin
NewThread[i] := TNewThread.Create(True);
NewThread[i].Site := sMemo1.Lines.Strings[i];
NewThread[i].Resume;
Application.ProcessMessages;
end;
end;


Не помогает.
PM MAIL   Вверх
Romikgy
Дата 14.4.2014, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



в потоке имхо надо...


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

PM   Вверх
UKRtortik
Дата 14.4.2014, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



а где именно в потоке?
PM MAIL   Вверх
Poseidon
Дата 14.4.2014, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(UKRtortik @  14.4.2014,  14:09 Найти цитируемый пост)
Poseidon, при старте программа полностю зависает секунд на 5-10, из-за чего? 
Тут нужно смотреть код. Может в OnCreate что-то "тяжелое" выполняется, может еще что. Так просто "на глаз" сказать сложно.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 14.4.2014, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



при чем сдесь OnCreate? Они же не при запуске программы зависает. А когда поток запускаю.
PM MAIL   Вверх
Romikgy
Дата 14.4.2014, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



где то между repeat  &  until (если не http затыка)


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

PM   Вверх
UKRtortik
Дата 14.4.2014, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



не помогает
PM MAIL   Вверх
Poseidon
Дата 14.4.2014, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(UKRtortik @  14.4.2014,  15:52 Найти цитируемый пост)
при чем сдесь OnCreate? Они же не при запуске программы зависает. А когда поток запускаю. 

Я не совсем понял изначально эту фразу 
Цитата(UKRtortik @  14.4.2014,  14:09 Найти цитируемый пост)
при старте программа полностю зависает секунд на 5-10


"При старте" - это на какой строке? Что показывает отладка? Вполне возможно что поток стартует быстро, и останавливается на HTTPSend.HTTPMethod. Я уже писал, "зависание" на HTTPSend вполне объяснимо.




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 14.4.2014, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



Цитата

"зависание" на HTTPSend вполне объяснимо.

А как с этим бороться?
PM MAIL   Вверх
Romikgy
Дата 14.4.2014, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



интернет мощнее


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

PM   Вверх
PointerToNil
Дата 14.4.2014, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



я бы первым делом избавился от synchronize
совсем
(есть postmessage, events и можно общаться просто через переменные/поля)
synchronize - главный источник проблем начинающих многопоточников
PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



А как без синхронизации сделать, я не много не понял.
PM MAIL   Вверх
PointerToNil
Дата 14.4.2014, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



я же ключевые слова давал 
или хотя бы так:
http://codeguide.ru/peredacha-informatsii-...oka-delphi.html
(только postmessage вместо sendmessage)
PM MAIL   Вверх
Poseidon
Дата 14.4.2014, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(PointerToNil @  14.4.2014,  17:23 Найти цитируемый пост)
я бы первым делом избавился от synchronize
С Synchronize запись в Memo делается двумя строчками кода. Извращаться для данной задачи с помощью PostMessage - это как в Питер из Москвы через Владивосток. Можно, но не целесообразно. При любом раскладе, даже с помощью PostMessage, мы передаем управление в VCL-поток для отрисовки Memo. Так почему же не воспользоваться специально предназначенным для этого Synchronize? Ну а общение через переменные - это вообще аут. А как эти переменные в VCL-потоке считывать? Цикл крутить? Таймер задействовать? Synchronize тут правильно использовано.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 14.4.2014, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



ну так как мне правильно сделать? В чем у меня ошибка?
PM MAIL   Вверх
Romikgy
Дата 14.4.2014, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



сначала надо определится в каком месте виснет 


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

PM   Вверх
CynicRus
Дата 14.4.2014, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



В 17-ой строке у тебя ошибка. А если серьёзно - загружаешь свой проект, и пошагово смотришь по нажатию F8, где же он тормозит. Предварительно расставив бряки.


Это сообщение отредактировал(а) CynicRus - 14.4.2014, 21:01
PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



а что не так в 17 строке?
PM MAIL   Вверх
CynicRus
Дата 14.4.2014, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Цитата(UKRtortik @ 14.4.2014,  21:12)
а что не так в 17 строке?

Это древняя шутка про отсутствие телепатических способностей. К делу отношения не имеет. Просто посмотри под отладчиком.
PM MAIL   Вверх
UKRtortik
Дата 14.4.2014, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



просто не очень понимаю как пользоватся отладчиком....

Добавлено через 1 минуту и 50 секунд
Цитата

Thread Start: Thread ID: 420. Process Project1.exe (5356)
Process Start: F:\Delphi\Project1.exe. Base Address: $00400000. Process Project1.exe (5356)
Module Load: Project1.exe. Has Debug Info. Base Address: $00400000. Process Project1.exe (5356)
Module Load: ntdll.dll. No Debug Info. Base Address: $77A80000. Process Project1.exe (5356)
Module Load: KERNEL32.dll. No Debug Info. Base Address: $77840000. Process Project1.exe (5356)
Module Load: KERNELBASE.dll. No Debug Info. Base Address: $759D0000. Process Project1.exe (5356)
Module Load: OLEAUT32.dll. No Debug Info. Base Address: $75410000. Process Project1.exe (5356)
Module Load: ADVAPI32.dll. No Debug Info. Base Address: $75FA0000. Process Project1.exe (5356)
Module Load: USER32.dll. No Debug Info. Base Address: $75A90000. Process Project1.exe (5356)
Module Load: GDI32.dll. No Debug Info. Base Address: $75EA0000. Process Project1.exe (5356)
Module Load: VERSION.dll. No Debug Info. Base Address: $750A0000. Process Project1.exe (5356)
Module Load: ole32.dll. No Debug Info. Base Address: $75140000. Process Project1.exe (5356)
Module Load: COMCTL32.dll. No Debug Info. Base Address: $6DB00000. Process Project1.exe (5356)
Module Load: msvcrt.dll. No Debug Info. Base Address: $75260000. Process Project1.exe (5356)
Module Load: WS2_32.dll. No Debug Info. Base Address: $77970000. Process Project1.exe (5356)
Module Load: SHELL32.dll. No Debug Info. Base Address: $76380000. Process Project1.exe (5356)
Module Load: COMDLG32.dll. No Debug Info. Base Address: $75DD0000. Process Project1.exe (5356)
Module Load: WINSPOOL.DRV. No Debug Info. Base Address: $75040000. Process Project1.exe (5356)
Module Load: OLEACC.dll. No Debug Info. Base Address: $6FAE0000. Process Project1.exe (5356)
Module Load: WINMM.dll. No Debug Info. Base Address: $70B60000. Process Project1.exe (5356)
Module Load: combase.dll. No Debug Info. Base Address: $77700000. Process Project1.exe (5356)
Module Load: RPCRT4.dll. No Debug Info. Base Address: $75920000. Process Project1.exe (5356)
Module Load: SECHOST.dll. No Debug Info. Base Address: $75890000. Process Project1.exe (5356)
Module Load: NSI.dll. No Debug Info. Base Address: $76370000. Process Project1.exe (5356)
Module Load: SHLWAPI.dll. No Debug Info. Base Address: $75E60000. Process Project1.exe (5356)
Module Load: WINMMBASE.dll. No Debug Info. Base Address: $70A10000. Process Project1.exe (5356)
Module Load: SspiCli.dll. No Debug Info. Base Address: $75120000. Process Project1.exe (5356)
Module Load: CRYPTBASE.dll. No Debug Info. Base Address: $75110000. Process Project1.exe (5356)
Module Load: SHCORE.dll. No Debug Info. Base Address: $73320000. Process Project1.exe (5356)
Module Load: bcryptPrimitives.dll. No Debug Info. Base Address: $750B0000. Process Project1.exe (5356)
Module Load: IMM32.dll. No Debug Info. Base Address: $753F0000. Process Project1.exe (5356)
Module Load: MSCTF.dll. No Debug Info. Base Address: $76290000. Process Project1.exe (5356)
Module Load: UxTheme.dll. No Debug Info. Base Address: $70B90000. Process Project1.exe (5356)
Module Load: dwmapi.dll. No Debug Info. Base Address: $70B00000. Process Project1.exe (5356)
Module Load: WTSAPI32.dll. No Debug Info. Base Address: $73A10000. Process Project1.exe (5356)
Module Load: WINSTA.dll. No Debug Info. Base Address: $739D0000. Process Project1.exe (5356)
Thread Start: Thread ID: 4928. Process Project1.exe (5356)
Module Load: OLEPRO32.DLL. No Debug Info. Base Address: $69830000. Process Project1.exe (5356)
Thread Start: Thread ID: 668. Process Project1.exe (5356)
Module Load: SETUPAPI.dll. No Debug Info. Base Address: $760E0000. Process Project1.exe (5356)
Module Load: CFGMGR32.dll. No Debug Info. Base Address: $75320000. Process Project1.exe (5356)
Module Load: DEVOBJ.dll. No Debug Info. Base Address: $75BB0000. Process Project1.exe (5356)
Thread Start: Thread ID: 920. Process Project1.exe (5356)
Module Load: CLBCatQ.DLL. No Debug Info. Base Address: $75370000. Process Project1.exe (5356)
Module Load: PROPSYS.dll. No Debug Info. Base Address: $6D8C0000. Process Project1.exe (5356)
Module Load: profapi.dll. No Debug Info. Base Address: $74090000. Process Project1.exe (5356)
Module Load: WindowsCodecs.dll. No Debug Info. Base Address: $69850000. Process Project1.exe (5356)
Module Load: thumbcache.dll. No Debug Info. Base Address: $73EC0000. Process Project1.exe (5356)
Module Load: MSIMG32.dll. No Debug Info. Base Address: $6F8C0000. Process Project1.exe (5356)
Module Load: Security.dll. No Debug Info. Base Address: $6FD30000. Process Project1.exe (5356)
Module Load: Secur32.dll. No Debug Info. Base Address: $74020000. Process Project1.exe (5356)
Module Load: IEFRAME.dll. No Debug Info. Base Address: $67340000. Process Project1.exe (5356)
Module Load: iertutil.dll. No Debug Info. Base Address: $75530000. Process Project1.exe (5356)
Module Load: fwpuclnt.dll. No Debug Info. Base Address: $733E0000. Process Project1.exe (5356)
Module Load: IdnDl.dll. No Debug Info. Base Address: $73AC0000. Process Project1.exe (5356)
Module Load: Normaliz.dll. No Debug Info. Base Address: $75520000. Process Project1.exe (5356)
Module Load: pshook.dll. No Debug Info. Base Address: $669C0000. Process Project1.exe (5356)
Module Load: imagehlp.dll. No Debug Info. Base Address: $754A0000. Process Project1.exe (5356)
Thread Start: Thread ID: 4276. Process Project1.exe (5356)
Thread Start: Thread ID: 92. Process Project1.exe (5356)
Thread Start: Thread ID: 3596. Process Project1.exe (5356)
Thread Start: Thread ID: 4332. Process Project1.exe (5356)
Thread Start: Thread ID: 1716. Process Project1.exe (5356)
Thread Start: Thread ID: 4432. Process Project1.exe (5356)
Thread Start: Thread ID: 3124. Process Project1.exe (5356)
Thread Start: Thread ID: 6928. Process Project1.exe (5356)
Thread Start: Thread ID: 5868. Process Project1.exe (5356)
Thread Start: Thread ID: 6672. Process Project1.exe (5356)
Thread Start: Thread ID: 4320. Process Project1.exe (5356)
Thread Start: Thread ID: 4792. Process Project1.exe (5356)
Thread Start: Thread ID: 5260. Process Project1.exe (5356)
Module Load: MSWSOCK.dll. No Debug Info. Base Address: $734A0000. Process Project1.exe (5356)
Thread Start: Thread ID: 4088. Process Project1.exe (5356)
Thread Start: Thread ID: 3092. Process Project1.exe (5356)
Thread Start: Thread ID: 7004. Process Project1.exe (5356)
Thread Start: Thread ID: 6660. Process Project1.exe (5356)
Thread Start: Thread ID: 1404. Process Project1.exe (5356)
Module Load: DNSAPI.dll. No Debug Info. Base Address: $74A60000. Process Project1.exe (5356)
Thread Start: Thread ID: 2696. Process Project1.exe (5356)
Thread Start: Thread ID: 5804. Process Project1.exe (5356)
Module Load: IPHLPAPI.DLL. No Debug Info. Base Address: $74B70000. Process Project1.exe (5356)
Module Load: WINNSI.DLL. No Debug Info. Base Address: $74A50000. Process Project1.exe (5356)
Module Load: rasadhlp.dll. No Debug Info. Base Address: $72930000. Process Project1.exe (5356)
Thread Exit: Thread ID: 4332. Process Project1.exe (5356)
Thread Exit: Thread ID: 5260. Process Project1.exe (5356)
Thread Exit: Thread ID: 7004. Process Project1.exe (5356)
Thread Exit: Thread ID: 5868. Process Project1.exe (5356)
Thread Exit: Thread ID: 6660. Process Project1.exe (5356)
Thread Exit: Thread ID: 4276. Process Project1.exe (5356)
Thread Exit: Thread ID: 92. Process Project1.exe (5356)
Thread Exit: Thread ID: 2696. Process Project1.exe (5356)
Thread Exit: Thread ID: 6672. Process Project1.exe (5356)
Thread Exit: Thread ID: 4792. Process Project1.exe (5356)
Thread Exit: Thread ID: 5804. Process Project1.exe (5356)
Thread Exit: Thread ID: 4088. Process Project1.exe (5356)
Thread Exit: Thread ID: 1404. Process Project1.exe (5356)
Thread Exit: Thread ID: 3092. Process Project1.exe (5356)
Thread Exit: Thread ID: 4432. Process Project1.exe (5356)
Thread Exit: Thread ID: 3124. Process Project1.exe (5356)
Thread Exit: Thread ID: 4320. Process Project1.exe (5356)
Thread Exit: Thread ID: 1716. Process Project1.exe (5356)
Thread Start: Thread ID: 5792. Process Project1.exe (5356)


PM MAIL   Вверх
PointerToNil
Дата 14.4.2014, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



UKRtortik, проверил свою ссылку - не работает, весь сайт накрылся - а вы что молчите?? вот, держите копию:
http://webcache.googleusercontent.com/sear...oka-delphi.html

а для начала я бы тупо закомментировал строку с synchronize и посмотрел бы на быстродействие

Рoseidon> С Synchronize запись в Memo делается двумя строчками кода. 

точно. на этом все и ловятся

Рoseidon> При любом раскладе, даже с помощью PostMessage, мы передаем управление в VCL-поток для отрисовки Memo. 

НЕТ же! асинхронное сообщение передаёт данные, а не управление. как и переменные.
передать управление из потока в поток вообще невозможно, хотя можно организовать видимость этого, тупо приостановив "вызывающий" поток до завершения действия в "вызываемом", что и делает synchronize

Рoseidon> Ну а общение через переменные - это вообще аут. А как эти переменные в VCL-потоке считывать? Цикл крутить? 

не "аут", а банальное низкоуровневое решение
вы наверное удивитесь, но окно принимает/обрабатывает сообщения тоже крутя цикл
согласен, что подобный низкоуровневый код лучше куда-то заинкапсулировать, но раз борланд не справился...
можно юзать OmniThreadLibrary или AsyncCalls еще

Рoseidon> таймер использовать?

проще sleep, хотя я бы предпочел CreateEvent и WaitForSingleObject

так уж вышло, что "из коробки" synchronize оказался единственным удобным средством для передачи сообщений VCL-потоку
но эта штука специфичная. гораздо полезнее во многих случаях был бы "Asynchronize" - то есть то же самое, но без приостановки потока (т. е. без удара по быстродействию)
вот тут недавно чел пострадал от synchronize: http://forum.vingrad.ru/index.php?showtopi...t&p=2604306

Это сообщение отредактировал(а) PointerToNil - 14.4.2014, 22:15
PM MAIL   Вверх
Poseidon
Дата 14.4.2014, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(UKRtortik @  14.4.2014,  21:12 Найти цитируемый пост)
а что не так в 17 строке? 
Вот, изучай.

Цитата(PointerToNil @  14.4.2014,  21:44 Найти цитируемый пост)
согласен, что подобный низкоуровневый код лучше куда-то заинкапсулировать, но раз борланд не справился...
можно юзать OmniThreadLibrary или AsyncCalls еще
 
Цитата(PointerToNil @  14.4.2014,  21:44 Найти цитируемый пост)
проще sleep, хотя я бы предпочел CreateEvent и WaitForSingleObject

По твоему подобные решения лучше Synchronize? Может вообще тогда на ассамблере писать, чо уж там?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PointerToNil
Дата 14.4.2014, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



Poseidon> По твоему подобные решения лучше Synchronize?

возможно, лучшее решение - Asynchronize, но его пока нет (и мне не нужно, а то мог бы попробовать набросать)

врожденный порок (для кого-то - фича) synchronize никуда не денется: он тупо останавливает вызывающий поток! кому это нужно? мне нет, поэтому любое решение, этого не делающее - для меня лучше

Poseidon> Может вообще тогда на ассамблере писать, чо уж там?

если речь о функции-утилите, которая пишется 1 раз, а используется в тысяче мест - то многие так и делают (в применении к потокам - смысла в ассемблере нет)

Это сообщение отредактировал(а) PointerToNil - 14.4.2014, 23:08
PM MAIL   Вверх
Poseidon
Дата 15.4.2014, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(PointerToNil @  14.4.2014,  23:03 Найти цитируемый пост)
он тупо останавливает вызывающий поток! кому это нужно?
Это дает гарантию, что к общему ресурсу (в частности к VCL-объекту) имеет доступ только один поток. Видимо PointerToNil не сталкивался с ситуациями, когда пока один поток перепрыгнет на одну строку, второй поток уже считает данные и изменит их. Synchronize для того и задуман, что бы гарантировать доступ только одного потока. Если у нас ситуация, когда один поток должен работать с данными, которые высчитываются в другом потоке, то как можно гарантировать правильность расчетов?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PointerToNil
Дата 15.4.2014, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



Poseidon, у меня просто слов нет, чтобы выразить...
конечно, к VCL-объекту имеет доступ только один поток - поток VCL!!! не в вызывающем же потоке исполняется метод-параметр synchronize!
если возникли сомнения: http://forum.vingrad.ru/index.php?showtopi...st&p=480368
и подробнее: http://www.delphiplus.org/articles/delphi/...s_programs.html
вот только зачем вызывающий поток-то для этого останавливать? 
это даже гарантию немедленного исполнения требуемого действия не может дать - поток VCL чем-то своим еще может быть занят
хотя на однопроцессорных и однотредовых машинах эта остановка еще имела смысл (ускорить запуск требуемого метода), но на многопроцессорных смысла уже не осталось
очевидно, это - реликт, оставшийся от старой эпохи (хотя скорее всего могли и тогда более правильно это сделать)

а вот и возможное решение (из второй ссылки):
По сравнению с Delphi 7 в классы потоков Delphi 2009 внесено много изменений. Прежде всего, в класс TThread добавлена группа перегруженных методов Queue, которые позволяют синхронизировать вызов методов с главным потоком в неблокирующем режиме.

Poseidon> Видимо PointerToNil не сталкивался с ситуациями, когда пока один поток перепрыгнет на одну строку, второй поток уже считает данные и изменит их

конечно нет, как же это, совсем без критических секций что ли?? (а для простых типов данных, <=4 байта - есть interlocked* функции)

Poseidon>Если у нас ситуация, когда один поток должен работать с данными, которые высчитываются в другом потоке, то как можно гарантировать правильность расчетов?

ну как бы сразу напрашивается переменные/поля на 3 состояния, сигнализирующие о том, что обработка данной порции данных еще не начата/начата/уже закончена или 2 переменные - счетчики числа взятых на обработку элементов и числа уже обработанных (причем синхронизировать доступ к ним (interlocked*) нужно только для операции установки состояния "взято на обработку" или увеличения счетчика взятых на обработку, только между несколькими потоками-обработчиками и только в случае, если их несколько, а VCL-поток волен читать их в любой момент) - но для кого-то это может показаться слишком простым и низкоуровневым, [sarcasm] тут же без пары крутых специальных классов с дюжиной методов не обойтись [/sarcasm] 
не любите циклы с ожиданием? используйте CreateEvent, (Re)SetEvent и WaitFor(Single|Multiple)Object

Это сообщение отредактировал(а) PointerToNil - 15.4.2014, 03:23
PM MAIL   Вверх
Poseidon
Дата 15.4.2014, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(PointerToNil @  15.4.2014,  02:16 Найти цитируемый пост)
вот только зачем вызывающий поток-то для этого останавливать? 
 А если ситуация, когда потоку надо обратиться к VCL несколько раз подряд? Как без блокируещего метода и без бубна гарантировать, что предыдущее обращание завершилось?

Цитата(PointerToNil @  15.4.2014,  02:16 Найти цитируемый пост)
конечно нет, как же это, совсем без критических секций что ли?? 
Т.е. если один поток отрабатывает критическую секцию, второй поток не ждет на входе в нее? Второй поток не простаивает? Это чем-то принципиально отличается от Synchronize?

Цитата(PointerToNil @  15.4.2014,  02:16 Найти цитируемый пост)
ну как бы сразу напрашивается переменные/поля на 3 состояния, сигнализирующие о том, что обработка данной порции данных еще не начата/начата/уже закончена или 2 переменные - счетчики числа взятых на обработку элементов и числа уже обработанных (причем синхронизировать доступ к ним (interlocked*) нужно только для операции установки состояния "взято на обработку" или увеличения счетчика взятых на обработку, только между несколькими потоками-обработчиками и только в случае, если их несколько, а VCL-поток волен читать их в любой момент) - но для кого-то это может показаться слишком простым и низкоуровневым, [sarcasm] тут же без пары крутых специальных классов с дюжиной методов не обойтись [/sarcasm] 
Ну да, реально проще наворотить с три короба кода, придумать крутые алгоритмы с переменными, сигнализированием, счетчиками, но ни за что не пользоваться Synchronize. А в чем разница, или поток будет крутить в холостую цикл, ожидая когда же нужная переменная примет нужное значение, что бы пойти дальше, или поток остановится, ожидая Synchronize?

Цитата(PointerToNil @  15.4.2014,  02:16 Найти цитируемый пост)
а вот и возможное решение (из второй ссылки):
Это не решение, а один из вариантов. Если потоку надо "вбросить" данные в VCL и идти дальше (как в случае автора), то Queue подойдет. А если потоку надо работать с данными VCL, то тут нужна гарантия что кто-то другой (поток или даже сам пользователь) не поменял эти данные в процессе.

А теперь самое интересное. У UKRtortik в Synchronize одна строчка кода, которая обрабатывается за долю секунды. Неужели блокировка потока на эту долю секунды и есть то самое "зависание" о котором пишет UKRtortik? Неужели если мы отправим в VCL неблокирующее сообщение вместо Synchronize, то поток не "зависнет"? Там по коду отчетливо видно, что поток посылает Get в сеть и ждет ответ. Вот это ожидание и есть причина. А Synchronize там вообще не при чем.

Модератор: Давайте вернёмся к теме обсуждения.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Romikgy
Дата 15.4.2014, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



F7 & F8


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

PM   Вверх
PointerToNil
Дата 15.4.2014, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



Poseidon> А если ситуация, когда потоку надо обратиться к VCL несколько раз подряд? Как без блокируещего метода и без бубна гарантировать, что предыдущее обращание завершилось?
это гарантируется тупо тем, что поток VCL только один и, естественно, обращения к нему выстраиваются в очередь (ну загляни в classes.pas что ли уже, если ссылки tl;dr)

Poseidon> Т.е. если один поток отрабатывает критическую секцию, второй поток не ждет на входе в нее? Второй поток не простаивает? Это чем-то принципиально отличается от Synchronize?
да. отличается по области применения. критические секции (или атомарный доступ к предложенным мной переменным-признакам или счетчикам) нужны для сериализации (очередизации) доступа к данным среди потоков-копий из одной группы/пула - они могут за эти данные конкурировать, например, пытаться одновременно "забрать" себе на обработку один очередной необработанный блок.
а в ситуации как у ТС, когда "рабочий" поток уже обработал блок данных и он ему больше не нужен, поток следующего этапа (занимающийся выводом) может его спокойно (если этот поток в одном экземпляре) забирать, он должен только о его готовности узнать либо по переменной-признаку, либо по сообщению в своей очереди. без конкуренции потоков синхронизация гораздо проще (нет толкотни соседей по очереди) 

Poseidon> Ну да, реально проще наворотить с три короба кода, придумать крутые алгоритмы с переменными, сигнализированием, счетчиками
да никаких "алгоритмов" тут нет! самое сложное тут - это 
Код

if flag[i] = ReadyForProcessing then begin {блок [i] готов к обработке и свободен - попытаемся занять}
  old_flag := InterlockedExchange(flag[i], InProcessing); {атомарный обмен}
  if old_flag <> ReadyForProcessing then {опаньки, кто-то опередил на микросекунду и занял раньше нас!} continue
    else {ок, занято нами} begin
    {Processing here}
    flag[i] := ProcessingCompleted; {можно менять уже без предосторожностей}
    {тут можно сделать PostMessage окну, обработчик сообщений которого выводит информацию и т.п.}
    end;
  end;
{если пробежали в цикле по всем i и у всех ProcessingCompleted - то завершаем тред, а если ни одного Ready то можно и поспать}
ну а написав "с три короба" лишь один раз, нормальный программист обернет это как следует, чтобы в другой раз просто вызвать метод/функцию
(обычно это успевают сделать за нас еще в Микрософте/Борлакадеро, и там у них внутри те же примитивные переменные и циклы)

Poseidon> А в чем разница, или поток будет крутить в холостую цикл, ожидая когда же нужная переменная примет нужное значение, что бы пойти дальше, или поток остановится, ожидая Synchronize?
предполагается, что "крутить цикл" будет ожидающий данных (пока еще не готовых) поток второго этапа (вывода и т.п.), а останавливать по Synchronize я не хочу потоки первого этапа ("рабочие"), к которым навалом других сырых данных в очереди ещё стоит (если вдруг наоборот, в очереди на вывод скопление образуется, то и крутить вхолостую ничего не придется)

Poseidon>А если потоку надо работать с данными VCL, то тут нужна гарантия...
да что же это такое то?!?! с данными VCL номинально разрешено работать только потоку VCL. к счастью, он у нас только один
гарантий же от глупости программиста никакие волшебные классы/методы/функции никогда не дадут
в частности, Synchronize блокирует только свой собственный поток (думаете, авторы VCL предполагали, что программист, только что послушно выполнив их рекомендации и вызвав правильный метод, может ТУТ ЖЕ СРАЗУ уйти в отрыв и с горя полезть в VCL напрямую, поэтому и решили это дело заблокировать?!? сорри за эмоции, если что) 
при этом Synchronize ничуть НЕ блокирует ВСЕ остальные потоки (вообще по-хорошему только сам поток может себя "поставить на паузу", как и закончить, хотя через winapi... но это не рекомендуется)

Модератор: Давайте вернёмся к теме обсуждения.
а без тредстартера основная тема все равно пока WaitingForSingleObject

Это сообщение отредактировал(а) PointerToNil - 15.4.2014, 12:16
PM MAIL   Вверх
Poseidon
Дата 15.4.2014, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(PointerToNil @  15.4.2014,  10:39 Найти цитируемый пост)
это гарантируется тупо тем, что поток VCL только один и, естественно, обращения к нему выстраиваются в очередь (ну загляни в classes.pas что ли уже, если ссылки tl;dr)
Отлично. Поток отдает VCL данные, что бы VCL их применил, и идет дальше. А дальше нужно эти данные прочитать. Поток считывает данные, наивно предполагая, что предыдущий код их изменил. Но вот незадача, наредивый пользователь влез своими руками и поменил что-то. И получилось у нас, что поток считал уже не те данные, которые ожидались. Ах да, можно же нагородить кучу проверок, флагов, блокировок, но Synchronize использовать ну никак нельзя.

Цитата(PointerToNil @  15.4.2014,  10:39 Найти цитируемый пост)
да никаких "алгоритмов" тут нет! самое сложное тут - это 
"Это" - 10 строк кода в примитивной реализации. Synchronize займет одну.

Цитата(PointerToNil @  15.4.2014,  10:39 Найти цитируемый пост)
ну а написав "с три короба" лишь один раз, нормальный программист обернет это как следует, чтобы в другой раз просто вызвать метод/функцию
Нормальные программисты уже обернули подобные велосипеды в Synchronize, Queue прочие методы TThread. Но богата земля русская умельцами, которые неприемлят буржуйские традиции.

Цитата(PointerToNil @  15.4.2014,  10:39 Найти цитируемый пост)
а без тредстартера основная тема все равно пока WaitingForSingleObject
Очень хочется увидеть код, который через WaitingForSingleObject заставит поток, который отправляет Get запрос, выполнятся без задержек. Пока это больше похоже на пустой треп. Автор стросил причину, ему причину указали. И эта причина совершенно не в использовании Synchronize.


 ! 
Poseidon
Обсуждение целесообразности использования Synchronize в данной теме является нарушением пункта 9 Правил форума. Сообщения в данной теме, являющиеся ответами на мои цитаты, будут расценены как провокация к нарушению Правил и будут удалены на основании пункта 3.


PointerToNil, если есть желание обсудить никчемность Synchronize, можешь создать для этого отдельную тему.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 15.4.2014, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



Цитата

Автор стросил причину, ему причину указали.

Извините я возможно не заметил, ну где мне указали причину?
PM MAIL   Вверх
Poseidon
Дата 15.4.2014, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(UKRtortik @  15.4.2014,  15:33 Найти цитируемый пост)
где мне указали причину? 
 
Цитата(Poseidon @  14.4.2014,  16:57 Найти цитируемый пост)
Вполне возможно что поток стартует быстро, и останавливается на HTTPSend.HTTPMethod. Я уже писал, "зависание" на HTTPSend вполне объяснимо.




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 15.4.2014, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



а что с этим делать?
PM MAIL   Вверх
stanilar
Дата 15.4.2014, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 9.2.2010

Репутация: нет
Всего: нет



Tесли HTTPSend - это Indy, то у ней может быть свой механизм потоков, с странным поведением которого вы и сталкиваетесь. 
PM MAIL   Вверх
Poseidon
Дата 15.4.2014, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(UKRtortik @  15.4.2014,  15:38 Найти цитируемый пост)
а что с этим делать? 
 
Цитата(Romikgy @  14.4.2014,  17:07 Найти цитируемый пост)
интернет мощнее



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
UKRtortik
Дата 15.4.2014, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



user posted image


этого что недостаточно?
PM MAIL   Вверх
Poseidon
Дата 15.4.2014, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



А покажи пинг того ресурса, куда отправляется Get.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PointerToNil
Дата 16.4.2014, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



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

Те приведенные 10 строк - вовсе не замена synchronize, они нужны для совсем другого случая - а именно, для сериализации доступа к данным между конкурирующими за них потоками (перечитайте абзац, где упоминается конкуренция). Там synchronize не применим никак, так как разбираться друг с другом должны несколько рабочих (неглавных) потоков! (обычно их число = числу ядер или *2 для гипертрединговой архитектуры). Участвует ли в этой конкуренции еще и главный (VCL) поток или нет - значения не имеет. 
Interlocked* функции (пример в тех 10 строках) - облегченная замена критическим секциям для случаев, когда нужна одноразовая атомарная операция с переменной/полем простого типа.

А вот TThread.Queue - отличный вариант (как замена synchronize), я как раз за него! (если он есть в вашей версии дельфей)

"без тредстартера основная тема все равно пока WaitingForSingleObject" - перевожу на русский: без тредстартера основная тема все равно пока зависла в ожидании одного объекта, т.е. тредстартера (это была попытка пошутить)

BTW, собрал и запустил код тредстартера - никакие "подвисания" не проявились

Это сообщение отредактировал(а) PointerToNil - 17.4.2014, 12:58
PM MAIL   Вверх
CynicRus
Дата 16.4.2014, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Цитата(UKRtortik @ 15.4.2014,  15:33)
Цитата

Автор стросил причину, ему причину указали.

Извините я возможно не заметил, ну где мне указали причину?

Яж тебе говорил - под отладчиком пошагово посмотри, где у тебя тормозит. Как пользоваться отладчиком? Можно заценить тут.
PM MAIL   Вверх
UKRtortik
Дата 16.4.2014, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



а как понять из-за чего зависает в открадчике? Зависать начинает на этой строке:

Код

Thread Start: Thread ID: 4276. Process Project1.exe (5356)

PM MAIL   Вверх
PointerToNil
Дата 16.4.2014, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



UKRtortik, тебе нужно найти строку в коде программы, исполнение которой тормозит
1 поставь breakpoint (F5) на первой после begin строке TNewThread.Execute
2 запусти программу (F9), в ней - свой тред, дождись срабатывания брейкпоинта (открытия экрана дельфи)
3 теперь жми F8 и следи за задержкой (между скрытием и новым появлением экрана дельфей, обычно это мерцание даже не успеваешь заметить) - многократно, пока не найдешь (или до выхода из метода)
PM MAIL   Вверх
UKRtortik
Дата 23.4.2014, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 24.3.2014

Репутация: нет
Всего: нет



PointerToNil, что-то я соровно так и не смог разобратся....
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1738 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.