Вопросы по Delphi (все версии) - часть 3 - [50] :: Прикладное программирование :: Компьютерный форум Ru.Board
Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3

Модерирует : ShIvADeSt

ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

Grande



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите, пожалуйста, прояснить ситуацию.
Создается поток с помощью BeginThread, убивается с помощью EndThread.
Вопрос: должен ли измениться хэндл потока после завершения?
Каким способом можно проверить, что поток действительно завершился?

Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 14:29 21-09-2007 | Исправлено: Grande, 14:31 21-09-2007
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
После завершения потока хэндл уже ни при чём. так как потока нет

Цитата:
Каким способом можно проверить, что поток действительно завершился?

Что он правильно завершился?
В конце процедуры потока просто выставляем флажок.
Основной код проверяет флажок. В простейшем случае (один меняет, один читает) синхронизацию можно и не делать. Но в целом, она не помешает. Можно сделать уведомление например на Event'ах Mutex'ах
но убивать поток по собственному желанию крайне не желательно. дело в том, что при убийстве потока его память не освобождается.  
Правильный способ - попросить поток об этом. например теми же флажками или Event'ами и Mutex'ами.
Тоесть, выставляется флажок потоку, мол пора тебе завершаться. поток время от времени проверяет флажок. и обнаружив команду - начинает закруглятся

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 15:18 21-09-2007
lavren



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grande
Перевести сможеш:
BOOL WINAPI GetExitCodeThread(
  HANDLE hThread,
  LPDWORD lpExitCode
);
 
Если lpExitCode<>STILL_ACTIVE поток умер!

Всего записей: 545 | Зарегистр. 29-05-2007 | Отправлено: 15:33 21-09-2007
Grande



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
Вы хотите сказать, что нежелательно вызывать EndThread в теле потока?
 
 
Добавлено:
lavren
Хм... Спасибо. Сейчас запробую...

Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 15:38 21-09-2007
skinash



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grande
Я приблизительно вот так завершаю поток:

Код:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if Assigned(WriteDataThread) then
  begin
    if WriteDataThread.Suspended then
      WriteDataThread.Resume; // чтобы поток можно было уничтожить
    WriteDataThread.Terminate;
    WriteDataThread.WaitFor;
    WriteDataThread.Free; // чтобы не было утечек памяти, а ещё лучше FreeAndNil()
  end;
end;

Всего записей: 145 | Зарегистр. 21-09-2006 | Отправлено: 15:42 21-09-2007
lavren



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вы хотите сказать, что нежелательно вызывать EndThread в теле потока?  

Естественно! Самый лучий вариант когда он сам завершиться!

Всего записей: 545 | Зарегистр. 29-05-2007 | Отправлено: 15:46 21-09-2007
Grande



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
skinash
Я делал нечто подобное:
 
while not (WaitForSingleObject(Sample, INFINITE) = WAIT_OBJECT_0) do ProcessMessagesEx;
ShowMessage('Поток завершен');
 
Но уж очень быстро получал сообщение о завершении потока, а потому и закрались сомнения.
 
Добавлено:
lavren
Имеется в виду, что поток завершится, когда код внутри него исполнится и нет необходимости его завершать принудительно?

Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 15:46 21-09-2007
lavren



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Grande
Да! По этому поводу хорошо написано в книге Дж. Рихтера.

Всего записей: 545 | Зарегистр. 29-05-2007 | Отправлено: 15:56 21-09-2007 | Исправлено: lavren, 15:57 21-09-2007
Grande



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lavren
Спасибо, многое прояснилось. С меня

Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 16:02 21-09-2007
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Grande

Цитата:
while not (WaitForSingleObject(Sample, INFINITE) = WAIT_OBJECT_0) do ProcessMessagesEx;

Здесь вообще-то нужно делать  
либо цикл с ProcessMessages и как написал lavren проверкой GetExitCodeThread
либо сделать WaitForSingleObject(поток, INFINITE), но эта функция затормозит основной поток случае пока дочерний поток не завершится, и приложение ничего делать не сможет

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 16:11 21-09-2007
Grande



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
Спасибо, понял. Почитал у Рихтера и последовал его советам

Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 16:18 21-09-2007
sanb



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
немогу найти где можно скачать Borland Delphi Turbo Edition (она вроде бесплатная), а Turbo Delphi Explorer edition это не оно?
заранее благодарен

Всего записей: 2189 | Зарегистр. 26-07-2006 | Отправлено: 02:13 22-09-2007 | Исправлено: sanb, 02:24 22-09-2007
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sanb вам сюда - Borland Turbo Editions: Delphi, C++, Delphi.NET, C# [?] там в шапке ссылки.
 
 
Добавлено:

Цитата:
Borland Delphi Turbo Edition (она вроде бесплатная), а Turbo Delphi Explorer edition это не оно?  

немного не так... ;-)))
из фака:
The new range of products that are being introduced are “Turbo™ Delphi®”, “Turbo Delphi for .NET”, “Turbo
C++” and “Turbo C#”. For each of these products there will be two editions, Explorer Edition and Professional Edition.
 
т.е. есть бесплатная Explorer Edition (с ограничением на работу с БД, добавление компонентов и прочая.../что лечится) и профессиональная Professional Edition.
 
 
Добавлено:
ещё - вот ссылка на оф.FAQ - http://www.codegear.com/article/34453/images/34453/turbo_faq.pdf

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 11:50 22-09-2007
Chuvakstepan



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Народ подскажите, как убрать вот это?
Убираю таскбар при помощи ShowWindow(FindWindow('Shell_TrayWnd', nil), sw_hide);
Но остаётся вот это

Всего записей: 202 | Зарегистр. 29-01-2007 | Отправлено: 17:55 22-09-2007 | Исправлено: Chuvakstepan, 17:57 22-09-2007
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Разве никто из вас не хотел в меню или на кнопки поместить картинки + надпись? Ба... Неужели никто не знает код...

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 21:20 22-09-2007
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Chuvakstepan
А если после ShowWindow перерисовать десктоп?

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 21:02 23-09-2007
skinash



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988

Цитата:
Разве никто из вас не хотел в меню или на кнопки поместить картинки + надпись? Ба... Неужели никто не знает код...

Просто никто этим не заморачивается. Зачем тогда VCL придумали? ИМХО ты занимаешься тем же самым.

Всего записей: 145 | Зарегистр. 21-09-2006 | Отправлено: 08:59 24-09-2007
lavren



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
Найди хорошие компоненты! Например DevExpr_02_aug_2007.

Всего записей: 545 | Зарегистр. 29-05-2007 | Отправлено: 09:27 24-09-2007
skinash



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lavren
Он на WInAPI пишет, чтобы exe-шники маленькие были, а ты ему DevExpress предлагаешь, где форма с гридом в exe больше 2 мегов весить будет

Всего записей: 145 | Зарегистр. 21-09-2006 | Отправлено: 09:55 24-09-2007
lavren



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
skinash
Упс! Не заметил! Извините!
Maks150988
Может я снова не то что надо скажу, но...
Каждый элемент на окне тоже окно! Каждый элемент имеет канву! На WinAPI доступ к канве реализуется через структуру DC. Доступ к ней:

Код:
HDC GetDC(
  HWND hWnd   // handle to window
);

Ну и там рисуешь все что хочеш!
Хорошая книга по WinAPI графике уже не продается!  
 
Добавлено:
Ктото может что нибуть подсказать про TinyDB? Чем  она луче за BDE, какие компоненты подходят (кроме родных TTinyDatabase, TTinyTable, TTinySession) и где можно их взять?

Всего записей: 545 | Зарегистр. 29-05-2007 | Отправлено: 10:57 24-09-2007
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3
ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru