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

    [Delphi] Seriale ed Eventi

    Ciao gente... chi mi aiuta a scrivere una Unit che crea degli eventi per gestire la COM1???

    devo solo sapere quando il buffer è pieno...

    Grazie mille!!!!

    ti ricordi quando da piccoli andavamo in treno? io mettevo il culo fuori dal finestrino e tu la faccia e tutti ci chiedevano se eravamo gemelli...

  2. #2
    up

    ti ricordi quando da piccoli andavamo in treno? io mettevo il culo fuori dal finestrino e tu la faccia e tutti ci chiedevano se eravamo gemelli...

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Prova a cercare qualche componente già pronto e collaudato tra i tanti proposti sul sito Torry Delphi's Pages.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    io ho usato qualche componente per la gestione della seriale, le funzioni per gestirla "manualmente" e il componente che da windows MSCOMM ma non ho visto un metodo che mi dice che il buffer è pieno.

    Se trovi qualcosa fammi sapere anche a me, può essere sempre utile.

    Ora guardo + attentamente tra quello che ho, se trovo qualcosa scrivo.

  5. #5
    grazie... anch'io mi sto scervellando... non è proprio proprio facile... in realtà sono riuscito con un thread a vedere se nella COM è arrivato qualcosa, ma lo faccio con un loop e la cosa è piuttosto gravosa per l'OS... l'idea era quella di creare un evento, ma è un macello... uff e sigh...
    ti ricordi quando da piccoli andavamo in treno? io mettevo il culo fuori dal finestrino e tu la faccia e tutti ci chiedevano se eravamo gemelli...

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Utilizzare un loop all'interno di un thread separato non è una soluzione così malvagia...anzi, a volte è una delle uniche soluzioni possibili.

    Devi solamente ricordarti di aggiungere una chiamata alla funzione Sleep al termine del blocco di istruzioni affinchè venga eseguita per ogni ciclo e lasci "respirare" la CPU.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Originariamente inviato da alka
    Utilizzare un loop all'interno di un thread separato non è una soluzione così malvagia...anzi, a volte è una delle uniche soluzioni possibili.

    Devi solamente ricordarti di aggiungere una chiamata alla funzione Sleep al termine del blocco di istruzioni affinchè venga eseguita per ogni ciclo e lasci "respirare" la CPU.

    Ciao!
    oppure

    codice:
    procedure MyDelay(msec:longint);
    var  
      start,stop:longint;  
    begin  
      start := gettickcount;  
      repeat  
      stop := gettickcount;  
      application.processmessages;  
      until (stop - start ) >= msec;  
    end;
    che credo che sia la stessa cosa.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Mmm...non è proprio la stessa cosa.

    La funzione che hai scritto tu è una funzione che serve a generare del ritardo, ed è ben diverso dalla funzione Sleep che, oltre a al ritardo, svolge anche altre funzioni importanti.

    La cosa importante di cui tenere conto nei thread non è generare del ritardo eseguendo operazioni di diverso tipo tra un ciclo e il successivo, bensì ricordarsi di cedere la CPU ad altri thread concorrenti di tanto in tanto.

    Non ho provato il codice che hai postato, ma sono quasi sicuro che, inserito all'interno di un thread, manterrebbe comunque la CPU al 100%, poichè al suo interno esegue effettivamente delle istruzioni, mentre lo scopo è quello di non eseguirne (e quindi di non impegnare la CPU), ma di lasciare che siano altri thread ad usufruire del proprio time slice di tempo per elaborare istruzioni.

    La funzione Sleep fa parte dell'API di Windows e svolge il proprio compito anche quando viene richiamata specificando un ritardo pari a 0 (zero) millisecondi. Richiamata in questo modo, segnala a Windows che può passare ad eseguire altri thread prima di ritornare a quello in questione, senza aggiungere ulteriori ritardi all'operazione (poichè il tempo passato come parametro equivale a zero).

    Per vedere bene il fattore occupazionale della CPU, sarebbe l'ideale utilizzare Windows NT, 2000 o XP e verificare la percentuale di lavoro attraverso il Task Manager.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Effettivamente alka non avevo considerato il fatto del thread.

    la funzione che ho postato dovrebbe far "respirare" ca cpu con "application.processmassage", ho provato adesso con un'applicazione che gira in background e un trhead e l'occupazione di cpu oscilla tra 0 e 1.

    comunque usare le funzioni delle api è sempre preferibile.

    Ciao

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Il metodo Application.ProcessMessages serve per forzare l'applicazione a gestire tutti i messaggi in coda prima di proseguire nell'esecuzione; forse utilizzi poca CPU poichè non hai messaggi da gestire (pochi timer, nessuna pressione del pulsante, ecc.) al momento della chiamata, altrimenti sarebbe come se quel ritardo non ci fosse.

    Il punto della questione non è utilizzare le API o no; il punto è questo: se il thread prevede un blocco di istruzioni cicliche, ad ogni ciclo è bene rilasciare la CPU a Windows in modo che la assegni ad altri processi; la funzione preposta è la Sleep. Altre implementazioni, invece, pur ottenendo un effetto apparentemente simile, non sono valide poichè anche una chiamata al metodo Application.ProcessMessages si traduce in una esecuzione di codice, ma noi non vogliamo eseguire codice o gestire messaggi, vogliamo solo che il thread si metta a tutti gli effetti in pausa.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.