|
Тема
|
Спиране на процес
|
|
Автор | Mишo (Нерегистриран) |
Публикувано | 15.01.05 15:51 |
|
Здравейте..
Тук се мъча със следния проблем - имам две процедури, в едната се върти постоянен цикъл, който трябва да спре при Stop =True и когато спре тази процедура сваля InProgres =False;
В другата процедура съответно правя Stop =True и в нея чакам за InProgres=False. И тук е проблема, InProgres никога не става False по този начин и цикълът става безкраен. Въпросът ми е , как да изляза от този цикъл, и да знам, че е прекратен.Опитавх различни варианти - съобщения, нишки, но явно бъркам техниката.. Помагайте
Ето и част от кода..
------------------------------------------------------
implementation
{$R *.dfm}
var Stop,InProgres:True;
procedure TForm1.Button1Click(Sender: TObject);
begin
Stop :=False;
InProgres:=True;
While Not Stop Do
Begin
Application.ProcessMessages;
Memo1.Lines.Add('Стартиран.');
end;
Memo1.Lines.Add('Спрян.') ;
InProgres:=False;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Stop :=True;
While InProgres Do
Application.ProcessMessages;
end;
------------------------------------------------------
Помагайте.
| |
Тема
|
Вземи научи нишките (Thread) :)
[re: Mишo]
|
|
Автор |
NikB (любопитен) |
Публикувано | 15.01.05 18:49 |
|
Ами при мен програмката ти върви без проблеми (почти):
1. Stop и ИнПогрес трябва да са боолеан;
2. в Мемото непрекъснато се пише "стартиран"
3. Най-добре разкарайуайла от бутон2 - не виждам смисъл от него, а и той "скрива" надписа "спрян" (извежда се след като излезеш от уайла (май:)
И ако напишеш за къф ти е тва - може и да измислим нещо по-
| |
Тема
|
Re: Вземи научи нишките (Thread) :)
[re: NikB]
|
|
Автор | Mишo (Нерегистриран) |
Публикувано | 15.01.05 19:43 |
|
Ако разкарам while от бутон2 заработва, така е.
Но в истинския си вид това е функция, която трябва да стане True, само ако наистина е прекратил онзи безкраен цикъл в другата процедура.. а това се вижда от inProgress.. затова и я проверявам тая променлива.
Eто как е в проекта:
--------------------------------------------
Function StopProgress : Boolean;
Begin
Stop :=True;
While InProgres Do Application.ProcessMessages;
Result:=InProgres ;
end;
--------------------------------------------
За нишките - да. Все си мисля, че трябва да преместя онзи цикъл в някакв thread и да го стопирам със StopProgress , но не ми се иска да усложнявам кода. Затова и търся друго решение или идеи.
| |
|
Така написано
--------------------------------------------
Function StopProgress : Boolean;
Begin
Stop :=True;
While InProgres Do Application.ProcessMessages;
Result:=InProgres ;
end;
--------------------------------------------
няма много смисъл. Цикълът ти се изпълнява докато InProcess не стане False, т.е. излезеш ли от цикъла InProcess при всички случаи ще е False. Така че май функцията не върши това, което искаш.
С нищи не е толкова сложно, колкото си мислиш. Кодът ти няма да се усложни, но ще се изчисти. По-добър съвет от този, който ти даде NikB не можеш да получиш. Поиграй си малко с нишките. Ако изпитваш някакви затруднения - пиши тука и ще се постараем да ти помогнем
| |
Тема
|
Re: Вземи научи нишките (Thread) :)
[re: andrew_nikoloff]
|
|
Автор | Mишo (Нерегистриран) |
Публикувано | 16.01.05 13:47 |
|
--------------------------------------------
Function StopProgress : Boolean;
Begin
Stop :=True;
While InProgres Do Application.ProcessMessages;
//Обърках го, като писах тук, във форума. Извинявам се
Result:=NOT InProgres ;
end;
--------------------------------------------
Всъщност, за да го прехвърля в нишка, ще е доста работа, тъй като, повечето от операциите са с VCL или разни променливи от основния thread и просто нямам идея как точно да го направя това.
Ще се наложи да пиша куп процедури synchronize, а пък още по-вероятно е да се наложи всичко да преправям, затова ми се искаше да намеря някакъв друг начин.
За сега съм го оставил така. StopProgress e процедура и онзи while е махнат. В този вариант изпълнението на основния процес спира нормално. Не е много чисто, но на този етап ми върши работа.
Всъщност, аз не съм програмист, а това, което правя е програмка, която би трябвало да ми помогне в работата, поради тази причина и нямам много време да принаписвам всичко наново. Ако имате някакви идеи, свързани с въпроса ми, но без използването на нишка, ще се радвам да ги обсъдим.
Благодаря.
| |
|
С или без not ефектът е един и същ - процедурата ти ще връща винаги едно и също. Това имах предвид, че нещо не е в ред в логиката й
Както и да е. Щом ти върши работа... Успех в работата!
| |
|
|
|
|