Zatrzymanie działania programu

Zatrzymanie działania programu
ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0

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

Kopiuj
bool stop = false;

a pod drugim przyciskiem dać stop = true;

Kopiuj
 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
Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

najlepiej IMO utworzyć nowy wątek

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0

I główny kod w pobocznym ?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

A co dla ciebie jest głównym kodem?

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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.

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Ile czasu zajmuje pełny cykl.

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0

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

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

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

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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.

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

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

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0

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

Kopiuj
switach()

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

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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.

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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.

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0

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

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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 ?

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
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")

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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.

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

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

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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.

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

a z jakiego środowiska korzystasz?

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
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

Kopiuj
//---------------------------------------------------------------------------

#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

Kopiuj
//---------------------------------------------------------------------------

#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

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

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

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0

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

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

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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
}
}

Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

pokaż co masz w unit1.h

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0
Kopiuj
//---------------------------------------------------------------------------

#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
Loganek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 268
0

zadeklaruj w tym pliku funkcję sumującą

ujemny
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Lublin
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.