Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-07-2010, 13:46   #1
fdf86
Member
 
L'Avatar di fdf86
 
Iscritto dal: Apr 2009
Messaggi: 83
[C++] GUI: esecuzione ciclo fino ad evento..

Salve a tutti,
Avrei bisogno di una dritta.
Perdonate il titolo ma non mi veniva nulla di meglio

Ho una GUI con vari bottoni..Lavora da server e da client contemporaneamente con un applicazione esterna che effettua dei calcoli e restituisce i risultati.
Tramite la GUI invio dei comandi su una porta e ricevo risposte e risultati su altre due porte differenti (questo è imposto dall'applicazione esterna).
Ho un pulsante che avvia il calcolo ed uno che lo ferma.
Vorrei acquisire e mandare a video (magari plottare in un grafico, ma questo lo vediamo dopo semmai) i risultati dopo l'avvio della simulazione finchè non viene premuto il tasto che stoppa il tutto..Come fare?
Credevo bastasse un while che controllasse una variabile globale o direttamente un evento ma non funziona..Una volta entrato nel while non riesco a cliccare altri pulsanti e quindi ad aggiornare la condizione del while.
Spero di non essere stato troppo confusionario.
Attendo suggerimenti, grazie

Francesco

Ultima modifica di fdf86 : 30-07-2010 alle 14:37.
fdf86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2010, 14:10   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da fdf86 Guarda i messaggi
Credevo bastasse un while che controllasse una variabile globale o direttamente un evento ma non funziona..Una volta entrato nel while non riesco a cliccare altri pulsanti e quindi ad aggiornare la condizione del while.
Così a naso direi che in questo modo il tuo ciclo viene eseguito dal thread dell'event-loop della GUI, quindi lo stai "congelando".
Dovresti delegare ad un altro thread questo lavoro.

Potresti dirci almeno in che linguaggio stai sviluppando, su quale sistema e con che libreria grafica per la GUI?
(Per quanto riguarda il titolo avresti dovuto prima leggere il regolamento, avrei evitato la domanda qui sopra)
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2010, 14:26   #3
fdf86
Member
 
L'Avatar di fdf86
 
Iscritto dal: Apr 2009
Messaggi: 83
Hai ragione,scusa..stavo giusto dandomi dell'imbecille perchè non avevo scritto cosa uso..poi ho visto che avevi già risposto..
Sto Usando WxDevC++ (uso la WxWidget) su wundows 7...ed uso la winsock.h (ma questo non credo serva).
Si credo che il problema sia proprio quello quindi devo delegare un altro button?

del tipo:

http://www.functionx.com/vccli/general/events.htm

Almeno il concetto insomma..

Scusami ma non sono espertissimo..Per la tesi ( ing Meccanica ) mi serve l'altro programma (OpenModelica per la cronaca) che è in continuo sviluppo..e quindi sono un mese che lavoro su cose mai viste prima..server, interfacce tra linguaggi, ed ora GUI..mi perdonerai spero.

Grazie ancora,
Francesco
fdf86 è offline   Rispondi citando il messaggio o parte di esso
Old 30-07-2010, 22:09   #4
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da fdf86 Guarda i messaggi
Scusami ma non sono espertissimo..Per la tesi ( ing Meccanica ) mi serve l'altro programma (OpenModelica per la cronaca) che è in continuo sviluppo..e quindi sono un mese che lavoro su cose mai viste prima..server, interfacce tra linguaggi, ed ora GUI..mi perdonerai spero.
ti capisco, tanto di cappello perchè splittare da un cosa all'altra all'inizio non è semplice. Io idem da quando lavoro.... però si impara parecchio così.
Comunque non ho capito bene chi effettua i calcoli... il server? Oppure il tuo client? Semmai prova a fare uno schema.
Se è il client che fa i calcoli, se non ho capito male vuoi un modo per fermare la computazione però hai il problema che la GUI a quel punto non risponde perchè è impegnata nel calcolo. Se è così devi per forza usare un thread separato.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 31-07-2010, 00:06   #5
fdf86
Member
 
L'Avatar di fdf86
 
Iscritto dal: Apr 2009
Messaggi: 83
Grazie..me ne sono accorto..purtroppo all'università (almeno alla mia) si fanno molte cose ma tutte en passant..io approfondisco in genere, per quel che si può approfondire col vecchio/nuovo ordinamento trimestrale..ma poi quando metto da parte un programma per un po' devo ricominciare tutto da capo...
Comunque..Allora lo schema è questo:



Applicazione______________Porte______________GUI


10501
Control Server <------------------------------ Client
comando



10500
Control Client ------------------------------> Server
risposta


10502
Transfer Client ------------------------------> Server
risultati




L'applicazione esterna (OMI ,OpenModelica-Interactive )fa i calcoli..è stata implementata da gente molto esperta (credo e spero ) e quindi è fatta apposta per calcolare, ricevere input e trasmettere output contemporaneamente..
La mia interfaccia serve per settare dei parametri, inviare i comandi di avvio pausa e fine, e visualizzare i risultati..
Le cose funzionano bene..i risultati li scrivo comunque in un file esterno..non vanno persi..Vorrei però visualizzarli mentre eseguo visto che OMI li trasmette..
diciamo che mi servirebbe questo ciclo while da quando clicco start a quando clicco pause o stop..
Appena posto provo a metterci qualcosa del genere..

http://wxforum.shadonet.com/viewtopi...light=delegate
e vi faccio sapere.

Grazie mille

Francesco
fdf86 è offline   Rispondi citando il messaggio o parte di esso
Old 31-07-2010, 21:19   #6
fdf86
Member
 
L'Avatar di fdf86
 
Iscritto dal: Apr 2009
Messaggi: 83
Ciao a tutti di nuovo..
Dopo una mezza giornata di studio e lavoro sono riuscito a creare quel thread..
Pare funzioni..solo che non riesco a chiamare la Delete() (o la Pause() )da un button diverso da quello dove lo inizializzo:

In GUIsFrm.cpp

Codice:
   
 void GUIsFrm::WxButton2Click(wxCommandEvent& event)
{
   ............
    //creo il thread in WxButton2Click

MyThread *PlotResult = new MyThread(WxMemo2,remoteSocket_res);

       PlotResult->Run(); 
.......
...
//e lo chiudo in WxButton3Click

    
void GUIsFrm::WxButton3Click(wxCommandEvent& event)
{

PlotResult->Delete();

.........
.........

MyThread::MyThread(wxTextCtrl* WxMemo2, SOCKET remoteSocket_res) 
:wxThread(),WxMemo2(WxMemo2),remoteSocket_res(remoteSocket_res) 
{ 
       Create(); 
} 


void* MyThread::Entry() 
{ 
    
    char buf[500];
    int n;
        while(1)
        {
                n=recv(remoteSocket_res, buf, sizeof(buf), 0);
                buf[n]=0;
                (*WxMemo2)<<buf<<"\n";
        
        if(TestDestroy()) 
                         break; 
        }
    return 0; 
}
Vi posto anche altre parti del progetto che non so se siano totalmente corrette e soprattutto ben collocate.(il Progetto si chiama GUIs)

In GUIsFrm.h


Codice:

#include "MyThread.h"

////Dialog Style Start
#undef GUIsFrm_STYLE
#define GUIsFrm_STYLE wxCAPTION | wxSYSTEM_MENU | wxMINIMIZE_BOX | wxCLOSE_BOX
////Dialog Style End



class GUIsFrm : public wxFrame
{
	private:
		DECLARE_EVENT_TABLE();
		
	public:
		GUIsFrm(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("GUIs"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = GUIsFrm_STYLE);
		virtual ~GUIsFrm();
		
		void WxButton1Click(wxCommandEvent& event);
		void WxButton2Click(wxCommandEvent& event);
		void WxButton3Click(wxCommandEvent& event);
		void WxButton4Click(wxCommandEvent& event);
		void GUIsFrmActivate(wxActivateEvent& event);
		void WxButton5Click(wxCommandEvent& event);
		void WxSlider1Scroll(wxScrollEvent& event);
		void WxSlider2Scroll(wxScrollEvent& event);
		void crea_addr(struct sockaddr_in* ,int , char* );
		MyThread *PlotResult; 

................
In MyThread.h

Codice:
#ifndef __MYTHREAD_H 
#define __MYTHREAD_H 


#include <wx/thread.h> 

class MyThread : public wxThread 
{ 
    wxTextCtrl *WxMemo2;
    bool        sim;
    SOCKET      listenSocket_res; 
    SOCKET       remoteSocket_res;


public: 
    MyThread(wxTextCtrl *WxMemo2, SOCKET remoteSocket_res); 
    virtual ExitCode Entry(); 
}; 

#endif


La GUI smette di funzionare quando clicco su un bottone che contiene la Delete(). Non succede se la inserisco nello stesso pulsante in cui lo creo.

Inoltre ho notato che se non inserisco la Delete() funziona abbastanza bene..cioè smette di scrivere risultati (anche perchè il simulatore non ne manda)..Solo non riesco a leggere più nulla se riavvio la simulazione.
devo inizializzare il Thread da qualche altra parte? Eventualmente, È proprio necessaria questa Delete?


Grazie in anticipo
Francesco
fdf86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Annunciata la tuta di volo di Vast che s...
Vast presenta il nuovo Large Docking Ada...
Una denuncia getta ombre sulle batterie ...
DJI Avata 2 Fly Smart Combo a 526€: il d...
Alla guida della nuova auto elettrica ci...
GeForce RTX 3060 12 GB a giugno di nuovo...
Apple Music sarà sponsor ufficiale di Po...
The Mandalorian & Grogu: trailer fin...
Fedeltà record: Apple blinda gli utenti,...
Volkswagen ID.3 Neo: fino a 630 km di au...
GPU-Z mette i dati personali a rischio? ...
La PS6 potrebbe essere retrocompatibile ...
Amazfit Cheetah 2 Pro arriva in Italia: ...
Duolingo ammette l'errore dopo un anno: ...
Samsung Galaxy Tab S10 Lite a 249€: il t...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v