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

Вниз

Потоки   Найти похожие ветки 

 
YURY_   (2011-11-29 14:11) [80]

Сергей М., почему к трупу? Ведь в примере с VCL второй поток не стартует совместно с первым, а именно ожидает несколько секунд, пока первый не отработает. Т.е. Ожидание завершения происходит, но по какой-то причине не происходит возобновление работы второго потока.


 
Кщд   (2011-11-29 14:12) [81]

YURY   (29.11.11 13:50) [71]
dbms_scheduler решает Вашу задачу


 
Сергей М. ©   (2011-11-29 14:13) [82]


> sniknik ©   (29.11.11 13:50) [72]
>  то ничего не нужно дополнительно, просто в поток нужно
> передавать не 1 значение на выполнение, а список


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


 
Медвежонок Пятачок ©   (2011-11-29 14:14) [83]

но по какой-то причине не происходит возобновление работы второго потока.

а его кто-то приостанавливал?
им обоим resume сделали.


 
YURY_   (2011-11-29 14:16) [84]

Медвежонок Пятачок, WaitFor и приостановил.


 
Сергей М. ©   (2011-11-29 14:16) [85]


> почему к трупу?


Потому что 1-й поток, которого 2-й будет ожидать, к моменту вызова 2-м потоком метода WaitFor запросто может успеть убить себя, закрыв при этом свой хэндл.  Что собссно и происходит, потому как сообщение "Thread error: Неверный дескриптор (6)" именно об этом тебе и сигнализирует.


 
Медвежонок Пятачок ©   (2011-11-29 14:17) [86]

Приостанавливает суспенд. Вайтфор не приостанавливает ни разу.


 
Сергей М. ©   (2011-11-29 14:18) [87]


> WaitFor и приостановил


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


 
YURY_   (2011-11-29 14:20) [88]

Сергей М., в данном случае я на форме наюлюдаю несколько секунд, как меняются значения в Edit1 от 0 до 20000 и только после этого происходит исключение. Если же WaitFor убрать, то оба потока стартуют одновременно и те же несколько секунд я наблюдаю изменение значений в обоих TEdit.


 
Медвежонок Пятачок ©   (2011-11-29 14:21) [89]

закройте уже тему, а?


 
YURY_   (2011-11-29 14:24) [90]

Медвежонок Пятачок, а вот тут сказано, что приостанавливает: "Попросту говоря, когда поток А вызывает метод WaitFor потока B, сам он приостановливается, пока поток B не завершится. "
http://forum.vingrad.ru/forum/topic-60076.html#st_0_view_0


 
Медвежонок Пятачок ©   (2011-11-29 14:26) [91]

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

Что дальше?


 
YURY_   (2011-11-29 14:27) [92]

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


 
Медвежонок Пятачок ©   (2011-11-29 14:28) [93]

закройте тему, а?

/* украина, политика, путин, газ, власти скрывают, нло, киркоров родил дочь от суррогатных матери и отца..... */


 
sniknik ©   (2011-11-29 14:29) [94]

> почему происходит ошибка.
потому что ты дебил, иного объяснения при куче ответов/объяснений на эту тему не вижу.


 
YURY_   (2011-11-29 14:30) [95]

Медвежонок Пятачок, если такая функция выполняется внутри потока, то она не приостанавливает поток - он выполняется в виде этой самой функции. Разве не так?


 
Сергей М. ©   (2011-11-29 14:32) [96]


> и только после этого происходит исключение


Так я ж тебе дважды нарисовал картину маслом почему оно происходит)
Что опять не понятно-то ?


 
sniknik ©   (2011-11-29 14:33) [97]

> Приостанавливает суспенд.
с другой стороны и суспенд работает не так как ожидается у него в коде, т.е. прямая замена (если кто то, не будем показывать пальцем, про это подумал) не поможет.


 
YURY_   (2011-11-29 14:33) [98]

sniknik, ну зачем на личности переходить? Лучше бы аргументировали. Ваше предположение о том, что первый поток завершился к моменту вызова WaitFor во втором потоке я опровергнул. Можете сами проверить - 1 минута времени требуется. Значит, дело в другом. Но в чём?


 
sniknik ©   (2011-11-29 14:34) [99]

> А список-то это кто будет формировать, Пушкин ?)
основной, там дел то будет на полсекунды...


 
Сергей М. ©   (2011-11-29 14:37) [100]


> "Попросту говоря, когда поток А вызывает метод WaitFor потока
> B, сам он приостановливается, пока поток B не завершится "


А если поток A вызывает WaitFor уже ПОСЛЕ того как поток B успел завершиться и уничтожить следы своего бытия, поток A при этом ничего не ждет - он немедля закругляется, сформировав перед этим отлуп ""Thread error: Неверный дескриптор (6)"


 
sniknik ©   (2011-11-29 14:37) [101]

> Значит, дело в другом. Но в чём?
вот тут то и пригодится "переход на личности", т.к. рзумные доводы ты проигнорировал, а опровержения какие то не убедительные, из твоих же фантазий, а не реальности.


 
YURY_   (2011-11-29 14:37) [102]

Сергей М., суть моего ответа в посте 98


 
Медвежонок Пятачок ©   (2011-11-29 14:38) [103]

Медвежонок Пятачок, если такая функция выполняется внутри потока, то она не приостанавливает поток - он выполняется в виде этой самой функции. Разве не так?

функция WaitFor у тебя внутри потока. Возврат из нее не сразу. Пока нет возврата, следующий код стоит.

функция formatdatetime тоже внутри потока может быть вызвана. Возврат из нее не сразу. Пока нет возврата следующий код стоит.

И чего?


 
Сергей М. ©   (2011-11-29 14:39) [104]


> предположение о том, что первый поток завершился к моменту
> вызова WaitFor во втором потоке я опровергнул


Да нифига ты его не опроверг.
Именно это и происходит - никакая иная ситуация в приведенном коде не может привести к ошибке с кодом 6.


 
YURY_   (2011-11-29 14:41) [105]

sniknik, Фантазии не причём. Есть пример с VCL (первый мой пост) и на его основе нетрудно убедиться, что дело вовсе не в том, что первый поток успевает завершиться до старта WaitFor второго. 1 минута времени для проверки. Но можно, конечно, попинять на фантазии человека, если нет идей. Тоже вариант.


 
Медвежонок Пятачок ©   (2011-11-29 14:42) [106]

Не обижайте вы пацана.
Ему и так кот в отладчик нассал.


 
sniknik ©   (2011-11-29 14:43) [107]

> и на его основе нетрудно убедиться
убеждаемся..
> FreeOnTerminate := True;
ой...
кранты убеждениям.


 
YURY_   (2011-11-29 14:44) [108]

Сергей М., а вы попробуйте запустить пример. Увеличьте, скажем, значение 20000 на порядок. И убедитесь, что несколько минут второй поток терпеливо ожидает завершения первого. И как только он завершается - происходит исключение. Или вы полагаете, что второй поток несколько минут не стартует после Resume?


 
Медвежонок Пятачок ©   (2011-11-29 14:47) [109]

procedure TForm1.Button1Click(Sender: TObject);
var
ThreadArray: Array of TMyThread;

К моменту выполнения магического кода внутри потоков массив уже мертв.
Дундук!


 
Медвежонок Пятачок ©   (2011-11-29 14:48) [110]

А если бы он был жив, то настал бы черед замечаний приведенных выше.


 
YURY_   (2011-11-29 14:49) [111]

Медвежонок Пятачок, почему массив мертв? Он умрет тогда, когда закроется главная форма. Не так ли?


 
Медвежонок Пятачок ©   (2011-11-29 14:51) [112]

Медвежонок Пятачок, почему массив мертв? Он умрет тогда, когда закроется главная форма. Не так ли?

твой массив умрет сразу после :

....
ThreadArray[0].Resume;
ThreadArray[1].Resume;
end;


 
Сергей М. ©   (2011-11-29 14:53) [113]


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


Дело именно в этом - сколько раз еще тебе это повторить чтобы ты наконец это понял ?)

Специально для фомы лениво-неверующего, не желающего прошарить исх-к WaitFor:

procedure TMyThread.Execute;
begin
if Assigned(ptrThread) then
 try
   ptrThread^.WaitFor;
 except
  on e: Exception do
    MessageBox(0, PChar(e.Message), "ГРАБЛИ", mb_ok);    
 end;

MessageBox(0, "Ты никогда не увидишь это сообщение, потому что FreeOnTerminate = True", "НЕТ ГРАБЛЕЙ", mb_ok);    
for i := j to k do
  ptrEdit^.Text := IntToStr(i);
end;


 
sniknik ©   (2011-11-29 14:53) [114]

> Увеличьте, скажем, значение 20000 на порядок.
время там не причем... оно в потоке УЖЕ и сразу прошло проверку
if Assigned(ptrThread) then
и ждет в WaitFor;, того момента, когда
> FreeOnTerminate := True;
второй поток будет разрушен.


 
Anatoly Podgoretsky ©   (2011-11-29 14:54) [115]

> YURY_  (29.11.2011 14:20:28)  [88]

Тебе повторить чтоли OnTerminate


 
YURY_   (2011-11-29 14:55) [116]

Медвежонок Пятачок, да, согласен. Ну пусть умирает. Он в данном примере не важен. Ок, массив умер. Но потоки-то живы! Им до этого массива дела нет. Так?


 
Медвежонок Пятачок ©   (2011-11-29 14:56) [117]

Да у него вообще не тот код работает что приведен здесь.

Смотрите выше.
Есть массив - локальная переменная процедуры баттон1клик.
Есть код потоков, которые обращаются к полям масива.
Но нигде нет ни передачи массива, ни одноименных полей потоков.

А массив помирает сразу после выхода из баттон1клик.

Этот нехороший человек просто парит нам моск.


 
app ©   (2011-11-29 14:56) [118]

Закрыто за безперспективностью



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

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

Наверх





Память: 0.66 MB
Время: 0.008 c
15-1321514725
DelphiN!
2011-11-17 11:25
2012.03.11
Сервер для хранения приложений для запуска их на клиентах


2-1322594941
Jacksotnik
2011-11-29 23:29
2012.03.11
Помогите с отчетом


15-1321734602
Юрий
2011-11-20 00:30
2012.03.11
С днем рождения ! 20 ноября 2011 воскресенье


15-1321899084
Rouse_
2011-11-21 22:11
2012.03.11
Напомните плз автора Парадокса


15-1321309685
Дмитрий С
2011-11-15 02:28
2012.03.11
Не понимаю, зачем википедия постоянно попрошайничает.





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