Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 53
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331

    [C++] Button click durante un ciclo

    Salve a tutti.
    Sto lavorando su un progetto in Visual Studio 2005 per un'applicazione su palmare.
    In quest'applicazione e' presente un CButton a cui e' legato un metodo: OnBnClickedButton1
    che dovrebbe essere attivato quando clicco sul bottone.
    Infatti nella message_map ho legato il metodo al bottone.
    Capita che l'applicazione si mette in un while in attesa di ricevere determinati dati o della scadenza del timer e se io clicco sul bottone durante il ciclo il metodo non viene attivato.
    io vorrei rendere possibile premere il bottone ed eseguire il codice ad esso associato anche quando l'applicazione e' bloccata nel ciclo while.
    E' possibile?

    Ciao e grazie
    Sandro

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma di che linguaggio/ambiente parli?

    Ricorda che il regolamento (e il buon senso) prevede che tu lo indichi ...

    Inoltre, sarebbe utile vedere il codice di cui parli ..
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    Scusa.
    Sto programmando in C++ su Visual Studio 2005.
    Il wizard di Visual mi ha creato due classi VendingMachineUserDgl.cpp e VendingMachineUserDgl.h.
    In VendingMachineUserDgl.h ho definito il metodo nel seguente modo:

    public:
    afx_msg void OnBnClickedButton1();

    mentre in VendingMachineUserDgl.cpp ho messo il seguente codice:

    BEGIN_MESSAGE_MAP(CVendingMachineUserDlg, CDialog)
    #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
    ON_WM_SIZE()
    #endif
    // ON_LBN_SETFOCUS(IDC_LIST1, &CVendingMachineUserDlg::OnSetFocusList1)
    ON_BN_CLICKED(IDC_BUTTON1, &CVendingMachineUserDlg::OnBnClickedButton1)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    e l'implementazione del metodo:

    void CVendingMachineUserDlg::OnBnClickedButton1()
    {
    MSG_C[POS_NTWADDR_1] = DIVIDE_UINT16(selectedVendingMachine.getNwkAddr(), 1);
    MSG_C[POS_NTWADDR_2] = DIVIDE_UINT16(selectedVendingMachine.getNwkAddr(), 0);
    MSG_C[POS_EP] = selectedVendingMachine.getEP();
    MSG_C[SIZE_MSGC-1] = (char)0x01;

    hCom.Purge();
    hCom.Write(MSG_C, SIZE_MSGC);
    Sleep(SLEEP);
    }

    cosi' facendo il codice del metodo OnBnClickedButton1 dovrebbe essere eseguito quando clicco ul bottone identificato da IDC_BUTTON1.
    Quando pero' l'applicazione e' bloccata in un ciclo while quando clicco sul bottone non succede nulla e usando il debug noto che non entra nel metodo fintanto che il while e' attivo.

  4. #4
    È normale: se l'unico thread dell'applicazione è bloccato nel while come può rispondere ai messaggi di Windows? Usa un thread separato per eseguire lunghe operazioni in background (occhio però ai problemi di sincronizzazione).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    mmmm, pensavo che ci fosse un thread parallelo a quello principale responsabile di ascoltare gli eventi sugli elementi della GUI.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No ... pensavi male ...

    Se non vuoi usare un altro thread, devi gestire la coda dei messaggi all'interno del ciclo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    E quello principale cosa farebbe, allora? L'unica alternativa vagamente possibile che mi viene in mente per ottenere un comportamento come quello che pensavi sarebbe che ogni gestore evento fosse avviato in un thread separato, ma sarebbe una follia!
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    331
    Originariamente inviato da oregon
    No ... pensavi male ...

    Se non vuoi usare un altro thread, devi gestire la coda dei messaggi all'interno del ciclo ...
    Io vorrei solo, all'interno del ciclo, intercettare il fatto che venga premuto il bottone.
    Se si potesse fare senza Thread preferirei!
    C'e' qualche soluzione? Come potrei realizzare la gestione della coda messaggi? In realta' ho un unico bottone di cui voglio intercettare il fatto che sia premuto.................

  9. #9
    Se vuoi che l'applicazione non sembri bloccata devi necessariamente usare un thread separato (a meno che non esista un equivalente del DoEvents di VB6 nelle MFC, ma di MFC non so molto, e soprattutto non è un metodo che mi piaccia molto...).
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La gestione dei messaggi e' proprio l'equivalente del DoEvents ... puo' essere usato abbastanza tranquillamente ... solo in particolari casi non e' consigliato, ma non mi sembra uno di questi ...

    Mostra il codice in cui esegui il ciclo (e' in un evento? in un metodo?) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.