Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    fltk Problema con i thread

    Ciao a tutti!

    Sto cercando di creare un interfaccia grafica con fltk. Ho un problema, anzi 2:

    1) Ho una dial che dovrebbe girare in automatico, la funzione di rotazione gira su un thread a parte, vorrei che finisse la rotazione prima di ripartire con l'esecuzione del programma ma non c'è verso, la gira un po', poi si blocca, poi riprende

    2) su questa dial vorrei attaccare un immagine e vorrei ruotasse anche questa ma niente.


    Mi aiutate? grazie di tutto

    ecco il mio codice

    #include <windows.h>

    #include "../fltk-1.1.7/FL/Fl.h"
    #include "../fltk-1.1.7/FL/Fl_Dial.h"
    #include "../fltk-1.1.7/FL/Fl_Window.h"
    #include "../fltk-1.1.7/FL/Fl_Button.h"
    #include "../fltk-1.1.7/FL/Fl_Box.h"
    #include "../fltk-1.1.7/FL/Fl_Slider.h"
    #include "../fltk-1.1.7/FL/Fl_Value_Output.h"
    #include "../fltk-1.1.7/FL/Fl_Text_Display.h"
    #include "../fltk-1.1.7/FL/Fl_Dial.h"
    #include "../fltk-1.1.7/FL/Fl_JPEG_Image.h"
    #include "../fltk-1.1.7/FL/fl_draw.h"



    ////DEMO/////
    HANDLE ThDemoTextDisplay;
    HANDLE ThDial;
    void ShowText (Fl_Widget *o)
    {
    Fl_Text_Display *Object = (Fl_Text_Display*) o;
    Fl_Text_Buffer *buff = new Fl_Text_Buffer;
    Object->buffer(buff);
    Sleep (1000);
    buff->text("Prova");

    }
    /////////////



    void RotateRoll(Fl_Widget *o)
    {
    Fl_Dial *Roll = (Fl_Dial*)o;
    while (Roll->value()<300)
    {
    Sleep(10);
    Roll->value(Roll->value()+1);
    }
    }

    void Set_Status(Fl_Widget *o)
    {
    Fl_Window *win = new Fl_Window(300,180, 300,100, "Prova");
    win->begin();
    Fl_Box *Box_Scelto_Status = new Fl_Box(30,35,105,210,"Propagazione stato");
    Box_Scelto_Status->align(FL_ALIGN_INSIDE|FL_ALIGN_TOP);
    Box_Scelto_Status->color ();
    Box_Scelto_Status->box(FL_FLAT_BOX);
    win->end();
    win->show();
    Fl::run();
    }
    void Set_Master(Fl_Widget *o)
    {
    Fl_Window *win = new Fl_Window(300,180, 300,100, "Prova");
    win->begin();
    Fl_Box *Box_Master = new Fl_Box(30,35,105,210,"Propagazione Master");
    Box_Master->align(FL_ALIGN_INSIDE|FL_ALIGN_TOP);
    Box_Master->color ();
    Box_Master->box(FL_FLAT_BOX);
    win->end();
    win->show();
    Fl::run();
    }

    int main(int argc, char **argv) {


    //FINESTRA PRINCIPALE
    Fl_Window *window = new Fl_Window(300,180, 1024,768, "Prova");
    window->begin();
    //BOX CON LO SLIDER PER SELEZIONARE LO STATUS
    Fl_Box *Box_Select_Status = new Fl_Box(30,35,105,210, "Status");
    Box_Select_Status->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_TO P);
    Box_Select_Status->color ();
    Box_Select_Status->box(FL_UP_BOX);
    //SLIDER PER LO STATUS
    Fl_Slider *Slider1 = new Fl_Slider (40,65,20,176);
    Slider1->selection_color(1); //setta il colore a rosso
    Slider1->slider_size(.08);
    Slider1->range(0,2);
    Slider1->step(1);
    //SETTO LA CALLBACK CHE VIENE CHIAMATA AL CAMBIAMENTO DELLO STATUS
    Slider1->callback(Set_Status);
    //BOX STATUS SETUP
    Fl_Box *Box_Status_SetUp = new Fl_Box(60,65,65,16,"Set-Up");
    //BOX STATUS STANDBY
    Fl_Box *Box_Status_StandBy = new Fl_Box (60,149,65,16,"StandBy");
    //BOX STATUS Operative
    Fl_Box *Box_Status_Operative = new Fl_Box (60,224,70,16,"Operative");
    //BOX CON LO SLIDER PER SELEZIONARE LA DDU
    Fl_Box *Box_Select_DDU = new Fl_Box(30,255,105,105,"Master");
    Box_Select_DDU->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_TO P);
    Box_Select_DDU->color ();
    Box_Select_DDU->box(FL_UP_BOX);
    //SLIDER PER LO STATUS
    Fl_Slider *SliderDDU = new Fl_Slider (40,280,20,75);
    SliderDDU->selection_color(1); //setta il colore a rosso
    SliderDDU->slider_size(.08);
    SliderDDU->range(0,1);
    SliderDDU->step(1);
    //SETTO LA CALLBACK CHE VIENE CHIAMATA AL CAMBIAMENTO DELLA MASTERSHIP
    SliderDDU->callback(Set_Master);
    //BOX DDU1
    Fl_Box *Box_DDU1= new Fl_Box(65,280,40,16,"DDU1");
    //BOX DDU2
    Fl_Box *Box_DDU2 = new Fl_Box (65,339,40,16,"DDU2");
    //BOX CON l'HEALTH STATUS DELLE DDU
    Fl_Box *Box_DDU_Status = new Fl_Box(30,375,105,105,"Health Status");
    Box_DDU_Status->align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_TO P);
    Box_DDU_Status->color ();
    Box_DDU_Status->box(FL_UP_BOX);
    //SLIDER PER LO STATUS
    //BOX DDU1
    Fl_Box *Box_Status_DDU1= new Fl_Box(40,400,35,15,"DDU1");
    //BOX DDU2
    Fl_Box *Box_Status_DDU2 = new Fl_Box (40,423,35,15,"DDU2");
    //VALUE OUTPUT HEALTH STATUS DDU1
    Fl_Value_Output *Health_DDU1 = new Fl_Value_Output (80,396,33,19,"%");
    Health_DDU1->align (FL_ALIGN_RIGHT);
    //VALUE OUTPUT HEALTH STATUS DDU2
    Fl_Value_Output *Health_DDU2 = new Fl_Value_Output (80,421,33,19,"%");
    Health_DDU2->align (FL_ALIGN_RIGHT);
    //SETTO IL VALORE DELLO STATUS DI DDU1
    Health_DDU1->value(50);
    //SETTO IL VALORE DELLO STATUS DI DDU2
    Health_DDU2->value(50);
    //BOX CON I DATA OUTPUT
    Fl_Box *Box_DataOutput = new Fl_Box(145,245,755,355,"Data Output");
    Box_DataOutput->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT|FL_ALIGN_TOP) ;
    Box_DataOutput->color ();
    Box_DataOutput->box(FL_UP_BOX);
    //TEXT DISPLAY ABSOLUTE WIND SPEED
    Fl_Text_Display *Abs_Wind_Speed = new Fl_Text_Display (305,276,95,24,"Absolute wind speed");
    Abs_Wind_Speed->align (FL_ALIGN_LEFT);
    //CREO L'IMMAGINE ROLL
    //Fl_JPEG_Image *ImgRoll = new Fl_JPEG_Image("res/Roll2.jpg");
    //CREO IL DIAL ROLL
    Fl_Dial *DialRoll = new Fl_Dial (675,55,210,175);
    DialRoll->type(FL_LINE_DIAL);
    DialRoll->range (0,360);
    DialRoll->angle1(90);
    DialRoll->angle2(450);
    DialRoll->step(1);
    //APPICCICO L'IMMAGINE ROLL SUL DIAL
    //DialRoll->image(ImgRoll);
    //ALLINEO L'IMMAGINE DENTRO IL DIAL
    DialRoll->align(FL_ALIGN_INSIDE);
    //CREO L'IMMAGINE PITCH
    //Fl_JPEG_Image *ImgPitch = new Fl_JPEG_Image("res/Pitch2.jpg");
    //CREO IL DIAL PITCH
    Fl_Dial *DialPitch = new Fl_Dial (225,55,210,175);
    DialPitch->range (0,360);
    DialPitch->step(1);
    //APPICCICO L'IMMAGINE ROLL SUL DIAL
    //DialPitch->image(ImgPitch);
    //ALLINEO L'IMMAGINE DENTRO IL DIAL
    //DialPitch->align(FL_ALIGN_INSIDE);
    //fl_circle(100,100,20);
    //////////DEMO///////////////
    ThDemoTextDisplay = CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)ShowText,Abs_Wind_ Speed,0,0);
    ThDial = CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)RotateRoll,DialRol l,0,0);
    ////////////////////////////
    window->end();
    window->show(argc, argv);
    Fl::run();
    WaitForSingleObject(ThDial,100);
    return 0;
    }

  2. #2
    nessuno sa aiutarmi?

  3. #3
    Moderatore di Windows e software L'avatar di darkkik
    Registrato dal
    Dec 2003
    residenza
    Pavia - Milano - Lodi.
    Messaggi
    11,481
    Sposto (tardivamente, mea culpa) in Programmazione.

    titolo editato.
    I can see much clearer now, I'm blind.
    Io fui già quel che voi siete, Quel ch'io son voi anco sarete.
    Remember that death is not the end, but only a transition
    All that we learn this time is carried beyond this life.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.