Zatrzymanie działania programu

0

Witam
Chciałbym zatrzymać wykonywanie programu w sumie kilku pętli, chciałem zadeklarować zmienną

bool stop = false;

a pod drugim przyciskiem dać stop = true;

 niestety program się zatrzyma a potem i tak się zawiesi. Czy jeżeli podam kod główny w wątku pobocznym to nie spowolni to programu ? Chciałbym się również dowiedzieć jakie jest najrozsądniejsze rozwiązanie tego problemu.
Pozdrawiam,
Adrian
0

najlepiej IMO utworzyć nowy wątek

0

I główny kod w pobocznym ?

0

A co dla ciebie jest głównym kodem?

0

Funkcje które wykonują najważniejsze instrukcje, i wstawić je chciałem pod przycisk 1

No właściwie to jedna funkcja bo w niej sie dopiero wywołuje wszystkie pozostałe, jest ona dosyć złożona

1

Wszystkie operacji które trwają powyżej pewnego progu czasowego lepiej wstawiać w osobny wątek.
Ten próg czasowy to jakieś 100 ms.
Owszem jeżeli tą operacje da się rozbić na pewne krótkie czasowo kroki to można wykonywać po jednym kroku w OnIdle.

0

Rozumiem, że mam po prostu rozbić tą funkcję na kilka części i każdą wstawić w osobny wątek ? Ten program wykonuje tylko w kółko jeden blok instrukcji, jedynie parametry wykonywania się zmieniają w zależności od ustawień. Jak pytam o jakieś głupoty to sory, ale pisze w borlandzie od paru dni dopiero. A tak w ogóle przedstawią może budową programu, Po prostu jest kilka mały funkcji które składają się na jedną większą i tak w kółko a ostatnia zawiera w sobie wszystkie i wykonuje cały ciąg instrukcji.

0

Ile czasu zajmuje pełny cykl.

0

Starałem się zrobić żeby trwało to jak najmniej więc jeden obrót 1,52 sec

0

w takim razie zrób to w osobnym wątku

0

W jednym tak? nie rozbijać na mniejsze części i każdą w oddzielny wątek. W sumie jednak maksymalny czas to około 30 sec, ale zdarza to się tylko w niektórych przypadkach bardzo rzadko a tak to tyle ile napisałem wcześniej.

0

no a te operacje są od siebie zależne? i ile trwa poszczególna niezależna operacja?

0

Na początku wykonane są 2 krótkie instrukcje później jest warunek

switach()

I w 3 przypadkach pętla będzie trwała 1,5 sec a w 4 30 sec.

0

Zależne czyli używają wspólnych zmiennych.
Przerzuć te zmienne do osobnej klasy.
Dodaj zmienną StepNumber

W OnIdle
switch(Klasa.StepNumber)
  {
   case 0: Klasa.Fun0(); break;
   case 1: Klasa.Fun1(); break;   
   case 2: Klasa.Fun2(); break;

   case N: Klasa.FunN(); break;
  }
Klasa.StepNumber=(Klasa.StepNumber+1)%(N+1);

Ale jeżeli nie uda ci się rozbić tego na krótsze funkcji trwające nie więcej niż 100 ms to rób w osobnym wątku.

0

Ok pomęczę się z tym później trochę jak bym się zaplątał gdzieś to napisze, ale jak na razie dzięki wielkie.

0

Zrobiłem w wątku bo uznałem, że tak prościej dzięki wielkie za pomoc wszystko działa super.

0

A jak bym chciał stworzyć ten wątek po przez File/New/Other... To jak mam się odwołać do moich funkcji z pliku unit1.cpp ?

1

tak samo jakbyś miał wszystko w jednym pliku, tyle że unit1.cpp musisz dołączyć do projektu. no i wypadałoby stworzyć plik nagłówkowy i dołączyć go do głównego kodu programu(poprzez #include "unit1.h")

0

No właśnie zrobiłem to wszystko a pliki nagłówków tworzą się same... Staram się wywołać co kol wiek, ale nie znajduje.

0

a jesteś pewien że unit1.cpp jest włączony do projektu? i jakie błędy się pojawiają?

0

A jak mam go włączyć ? są dodane pliki nagłówków, plik stworzyłem przez aplikacje. A co do błędu to porostu jest tak samo jak bym chciał użyć nieistniejącej funkcji.

0

a z jakiego środowiska korzystasz?

0

Z C++ Builder 6 już dołączyłem za pomocą kreatora ale funkcja i tak nie działa zrobiłem teraz byle jaki projekt, żeby sobie w swoim nie na babrać i funkcje byle jaką.

Unit1

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
int suma(int a, int b)
{
        return a+b;
}
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


Unit2

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall akcja::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__fastcall akcja::akcja(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall akcja::Execute()
{
       int a = suma(2,5);
}
//---------------------------------------------------------------------------

W taki sposób na swoim kodzie wcześniej próbowałem

0

po co dołączasz Unit1.h w unit2.h? i jakie błędy występują przy kompilacji?

0

Gdzieś tak wyczytałem...:), ale to chyba kodu nie popsuje.

[C++ Error] Unit2.cpp(31): E2268 Call to undefined function 'suma'

1

Tak nadpisana metoda Execute skończy się natychmiast, mówiłeś ze u ciebie ma się powtarzać w kółko więc powinno to wyglądać tak:
void __fastcall akcja::Execute()
{
while(!Terminated())
{
// coś rób, ale samej pętli wystarczy
}
}

0

pokaż co masz w unit1.h

0
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
0

zadeklaruj w tym pliku funkcję sumującą

0

Ok, komentarza nie zauważyłem wcześniej taki głupi błąd a takie dochodzenie.
Dzięki za cierpliwość.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1