You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Thursday, January 11th 2007, 10:54pm

Programm überlastet, wie verhindern?

Hi!
Bei mir tritt beim programmieren öfter das Problem auf dass, mein Programm so mit rechnen beschäftigt ist das es auf keine Ereignisse(z.B. OnClick) reagiert, bzw Captions werden nicht "pünktlich" aktualisiert...

Um das ganze zu verdeutlichen habe ich ein programm geschrieben welche zunächst eine ListBox erzeugt, klickt man dann auf den Button so wird von 0 bis 1000 in 0,1er schritten hochgezählt und immer der Sinus errechnet wird, dies soll zur überlastung dienen...

Hiermal der Code(Compiler = Borland)

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=0; i < 1000; i=i+0.1)
Label1->Caption = sin(i);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i=0; i < 200; i++)
ListBox1->Items->Add(i);
}
//---------------------------------------------------------------------------


Während der Überlastung ist es nun nichtmehr möglich in der ListBox zu scrollen(dass soll als Beispiel dienen)


Nun meine Frage:
Was für möglichkeiten gibt es so etwas zu verhindern?
Gibt es eine Funktion die einfach zwischendurch mal überprüft ob Ereignisse stattgefunden haben und die entsprechenden Funktionen aufruft??



Schonmal vielen Dank!!

MfG Straightflush

2

Thursday, January 11th 2007, 11:32pm

Du lässt einfach die Business-Logik im Hintergrund in einem anderen Thread laufen, während der UI-Thread (es kann nur einen geben) Inputs entgegen nehmen kann.

3

Thursday, January 11th 2007, 11:40pm

das hab ich jetzt glaube ich nicht verstanden?

meinst du:
ich soll 2 Threads laufen lassen, einen welcher im Hintergrund rechnet und einen welche die Ereignisse annimmt?

Wenn es so ist hast du dann vll nen Link zu nen Tutorial/Beispiel wie man mehrere Threads erstellt?

Gibt es vll noch eine einfachere Methode?

4

Friday, January 12th 2007, 12:25am

Such einfach in Google nach "C++ Thread tutorial"
Eine einfachere Variante fällt mir nicht ein - außer den Code zu optimieren ;-)

5

Friday, January 12th 2007, 3:40pm

schade hatte geglaubt mich an eine Funktion zu erinnern welche überprüft ob ein Ereignis stattgefunden hat

6

Friday, January 12th 2007, 3:50pm

Da kann ich leider nichts dazu sagen.
Mag gut sein, dass es so etwas gibt.
Vielleicht hat jemand anders noch eine Idee dazu???

7

Monday, January 15th 2007, 11:46am

Wenn du es nicht schaffst, deine langdauernde operation selber in portionen zu zerstueckeln um dazwischen zeit fuer die abarbeitung der events zu bekommen (loesung 1) musst du halt das BS das fuer dich machen und den code in zwei oder mehrere quasi parallele ausfuehrungspfade aufteilen (Threads, loesung 2) .

Mehr moeglichkeiten gibts ned ....

Ciao ...

8

Monday, January 15th 2007, 12:29pm

Was du behelfsmäßig auch machen kannst, ist in jedem zehnten Schleifendurchgang Application->ProcessMessages aufrufen. Das ist aber nur bedingt ein geeignetes Mittel und in manchen Situationen wäre Threading sicher sinnvoller. Das hängt aber auch damit zusammen was du gerade machst und wofür du es brauchst.

9

Monday, January 15th 2007, 8:31pm

genau sowas wars!!

super! vielen dank!

Muss ich die nächsten Tage mal ausprobieren

Similar threads

Social bookmarks