|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не работает suspend
Запускаю поток: thread1.resume. В методе execute вызвается другой метод, в котором есть цикл. Так вот, в основной программе нажимаю кнопачку в которой прописано thread1.suspend, но почему то поток не хочет вставать на паузу. Цикл в потоке как крутился так и крутится. Что делать? Нужно поставить поток на паузу в цикле, а потом возобновить по нажатию другой кнопачки.
|
#2
|
||||
|
||||
код в студию
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Код показать не могу, но выглядит примерно так:
Код:
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, DateUtils; type TMyThread = class(TThread) private { Private declarations } protected procedure MyMethod; procedure Execute; override; end; implementation uses Unit1; { TMyThread } procedure TMyThread.MyMethod; var i: INTEGER; j: INTEGER; k: integer; begin for j := 0 to 999 do begin ... for i := 0 to 999 do begin ... for k := 1 to 999 do begin ... end; ... end; end; ... end; procedure TMyThread.Execute; begin try Synchronize(MyMethod); except end; end. В кнопке: Код:
procedure TForm1.bPauseClick(Sender: TObject); begin P.Suspend; //P - глобальная переменная end; Но цикл как продолжал работать, так и работает. |
#4
|
||||
|
||||
Насколько видно из кода bPauseClick у Вас срабатывает только после выполнения TMyThread.MyMethod.
Вообще непонятно зачам вам поток - единственное что он делает это выполняет TMyThread.MyMethod в основном потоке ( для этого и предназначена Synchronize ) |
#5
|
|||
|
|||
Если я сделал поток, значит он нужен. MyMethod обращается к компоненту главной формы и чтобы не возникло форсмажоров он вызывается через Synchronize
|
#6
|
||||
|
||||
Я просто не заметил многоточий в методе TMyThread.Execute.
Если он действительно содержит только то, что у Вас на писано, то сработает он таким образом: После запуска подождет основной поток, затем в основном потоке выполнит TMyThread.MyMethod ( при этом обработка сообщений производится основным потоком не будет ). Затем завершится. Соответственно выполнение метода TMyThread.MyMethod из основного потока Вы прервать не сможете. |
#7
|
||||
|
||||
Несколько вариантов решения проблемы:
1. Синхронизировать только моменты работы с VCL. Данные можно передавать, например, так PHP код:
3. Создать буферный объект ассинхронной передачи. - на основе дополнительной нити ( синхронизируем только передачу ему данных, например через критическую секцию и выставляем ему событие, а он уже ждет основную нить ) - через объект синхронизации ( синхронизируется только запись чтение из него данных , например через критическую секцию и форме посылается сообщение, что есть новости PostMessage, которые ана сама заберет ) |
#8
|
|||
|
|||
А если на кнопку надо паузу повесить, то есть при нажатие кнопки сделать паузу на всех активных потоках?
|