Newsgroup: it.comp.programmare.win32
Titolo: Programma inarrestabile!

Ciao,
sono alle prese con un programma di ricerca operativa
che deve trattare un problema NP-completo: il programma
l'ho scritto io in BC++Builder 5.
Il problema č che quando lo lancio e poi mi accorgo
che il prg suddetto ci mette troppo (perchč i parametri
che ho dato sono troppo alti) e voglio fermarlo... NON
SI FERMA!!!
Assorbe cosě tanta CPU che il sistema non risponde piů
nč al mouse nč alla tastiera :-(
E nel frattempo il file di swap comincia a mangiarsi
tutto lo spazio su disco, finchč dopo qualche minuto
WinXP blocca il prg e tutto il sistema insieme a lui.
Come posso fare per renderlo un pň piů "docile" ai
comandi?

 comandi?
Se ho ben capito c'č una qualche routine piuttosto lunghetta
da eseguire. Come consiglio ti direi di provare a metterla
in un thread (classe TThread). Vedrai che cosě l'interfaccia
grafica č sempre gestita, dopodichč devi sincronizzare le
cose, cioč quando viene premuto il pulsante X (o qualunque
altro evento) il thread si deve fermare.
HTH,
==========================
Stefano Frosio
http://www.esse-effe.com
==========================

 ha scritto nel messaggio
news:lPtZa.36858$an6.1...@news1.tin.it...

penso che tu hai un loop generale del programma che continua a ciclare vero
???
se e' cosi' ti basta inserire in tale loop alla fine uno sleep(1) per
renderlo un po' meno succhia risorse e un po' piu' docile ai comandi esterni
...
cmq come lo hai sviluppato ??? a classe base per un'alplicazione di
finestra, o lo hai fatto con lo switch dei comandi di finestra ???
o piu' semplicemente lo hai fatto per il terminale ???
cmq ti consiglio di controllare bene tutti gli errori di allocazione
dinamica, errori ecc ... perche' molto probabile ti schiatta win perche' hai
occupato tutta la memoria ed hai tentato di accedere all'esterno della tua
area ... quindi controlla tutti gli errori di bad_alloc, e se non hai piu'
memoria ferma il programma con un exit o vedi tu cosa fare ...
per il resto non so cosa suggerirti ... io ho provato a darti qualche
consiglio vedi tu come vanno ...
ciao

 comandi?
In situazioni come queste la risposta è una sola parola: thread.
Crea un altro thread oltre a quello primario: quello primario si occuperà
di gestire la message queue e di rispondere ai messaggi di tastiera e
mouse, mentre l'altro sarà un worker thread (ops, tu non usi vc++, non so
se questo concetto esiste anche in bcb) che farà tutti i calcoli che vuoi;
puoi anche impostare la priorità del thread (in un certo senso il suo
livello di invadenza); tuttavia, winxp è duro da bloccare; l'unica volta
che ci sono riuscito è stato quando ho installato un hook da tastiera e
uno da mouse che non chiamavano CallNextHookEx; se tu ci sei riuscito, o
hai un computer lento o hai commesso qualche errore nella gestione della
memoria dinamica (tipo allocazione di un blocco da 1 giga e mezzo, e roba
simile...); vedi un po' tu...
ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Grazie a tutti, in effetti era abbastanza semplice
una volta capito cosa dovevo fare... adesso ho fatto
in modo che la routine di calcolo principale chiami
Application->ProcessMessages() ogni tot migliaia di
iterazioni e il programma ora è controllabilissimo :-)

 iterazioni e il programma ora č controllabilissimo :-)
in questo modo comunque non hai usato i threads, me se a te va bene cosě...
Ciao, Al.


 in questo modo comunque non hai usato i threads, me se a te va bene cosě...
Bč, se si puň risolvere in maniera semplice, perchč complicare tutto?
P.S. sono sempre Stanislao, ho solo cambiato nick

 Bč, se si puň risolvere in maniera semplice, perchč
complicare tutto?
Perchč con la tua soluzione la routine ciclica sarŕ
estremamente piů lenta di prima. Se poi la differenza č di 5
secondi su 10 allora magari sono anche d'accordo, ma se poi
elabori molti piů dati e perdi 5 ore su 10 vedrai che cambi
idea.
