Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    Come si può rpetere un azione senza l'ausilio dell'oggetto timer?

    Provo a spiegarmi.
    Dovrei inviare alla LPT una sequenzadi dati. Questo serve per muovere un motore a passi.
    Il tutto dovrebbe accadere quando tengo premuto un pulsante.
    Mi spiego:
    Clicco e tengo premuto il pulsante "PULS".
    Fintanto che PULS è premuto alla LPT arriva, ad esempio, %01010000, pausa, %01100000, pausa, %10100000%, pausa, 10010000...... e cosi da capo fintanto che PULS rimane premuto.
    Ho realizzato questo con l'ausilio dell'oggetto timer, impostanto l'intervallo a 1 millisec.
    L'inconveniente sta nel fatto che 1 millisec è ancora troppo lento, ma l'oggetto Timer meno di questo valore non accetta.
    1 millisec potrebbe sembrare già un tempo ridottisimo ma si tratta di gestire gli avvolgimenti un motore a passi e 1 millisec lo fa girare "lentino".
    Mi chiedo allora se esiste un altro modo per poter realizzare una cosa simile.
    Ora lasciamo stare la sequenza che deve arrivare etc etc; per farla semplice..... e per poter comprendere meglio.....
    .......se ad esempio volessi un "beep" ogni 0,5 millisec fintanto che tengo premuto un pulsante, come si fa?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    I tempi che richiedi non sono compatibili con Windows ... almeno non con un programma scritto in VB ...

    Anche se impostato ad 1 ms, il timer di Windows non ti permette comunque di scendere sotto i 15 ... 10 ms.

    Devi lavorare con i timer multimediali e preferibilmente un linguaggio come il C ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Linguaggio? Versione?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    tnx tnx ......
    Ho capito, mi accontento di quello che passa il convento.....

  5. #5
    dunque ho fatto una prova che devi vedere se riesci a integrare nel tuo programma.

    la teoria è questa. All'avvio del programma crei un thread separato, che sarà il thread che farà le operazioin rchieste per tutta la durata del tempo in cui il bottone è premuto, al rilasico del bottone il thread viene messo in pausa.

    Nella prova che ho fatto io ho messo un contatore, inizialmente a zero, e il thread non fa altro che ciclare, incrementandolo di 1 ad ogni ciclo, per tutta la durata in cui un bottone è premuto. Il problema di questo sistema è che il numero di incrementi dipende dalla velocità del computer poichè non c'è nulla che scandisca il tempo. Ho fatto una prova e, con il mio pc, un click velocissimo sul bottone mi incrementa il contatore di circa 6.000.000. Se lascio premuto per un secondo il contatore mi arriva a circa 130.000.000.
    Si può rallentare, ma non mi è venuto in mente nulla che lo renda indipendente dalla velocità del processore. L'unico modo sarebbe con lo sleep del thread fra un incremento e l'altro ma ritorneremmo al problema di partenza perchè l'unità minima dello sleep è di 1 ms.

    cmq, l'esempio (in c#) che ho fatto è questo:

    Ho un bottone (button1) e una textbox(textbox1) che visualizzaerà il valore del contatore.
    Per interagire con il thread ho fatto un singleton, ecco il suo codice:

    codice:
    	public class MySingleton
    	{
    		public int Contatore = 0;
    		private static readonly MySingleton instance = new MySingleton();
    		private bool _IsButtonPressed;
    		public bool IsButtonPressed
    		{
    			get{return _IsButtonPressed;}
    			set{_IsButtonPressed = value;}
    		}
    		public static MySingleton GetInstance()
    		{
    			return instance;
    		}
    		private MySingleton()
    		{
    			_IsButtonPressed = false;
    		}
    	}
    il bottone ha 2 eventi: MouseDown e MouseUp: ecco il codice del form.

    codice:
    	using System;
    	using System.Drawing;
    	using System.Collections;
    	using System.ComponentModel;
    	using System.Windows.Forms;
    	using System.Data;
    	using System.Threading;
    
    	public class Form1 : System.Windows.Forms.Form
    	{
    		private Thread MyThread;
    
    //segue il codice del designer
    //.....
    //.....
    //Fine designer
    
    		private void Form1_Load(object sender, System.EventArgs e)
    		{
    			MyThread = new Thread(new ThreadStart(DoSomething));
    			MyThread.Start();
    			MyThread.Suspend();
    		}
    		private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			MySingleton.GetInstance().Contatore = 0;
    			MySingleton.GetInstance().IsButtonPressed = true;
    			MyThread.Resume();
    		}
    
    		private void button1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    		{
    			MySingleton.GetInstance().IsButtonPressed = false;
    			textBox1.Text = MySingleton.GetInstance().Contatore.ToString("#,#");
    			MyThread.Suspend();
    		}
    
    		private void DoSomething()
    		{
    			MySingleton MySingletonInstance = MySingleton.GetInstance();
    			while(true)
    			{
    				while(MySingletonInstance.IsButtonPressed)
    				{
    					//for(int i = 0; i < 100000; i++){} //Questa la puoi decommentare per rallentare l'incremento... ma resta comunque dipendente dalla velocità del processore
    					MySingletonInstance.Contatore += 1;
    				}
    			}
    		}
    
    		private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    		{
    			MyThread.Resume();
    			MyThread.Abort();
    		}

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da KataKlism2002
    ... (in c#) ...
    Se non ho capito male, lui lavora in VB6 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    ah... non si capisce affatto...

  8. #8
    Utente di HTML.it L'avatar di fu510n
    Registrato dal
    Sep 2005
    Messaggi
    137
    Ragazzi è intervenuto pure il moderatore... non dovreste nemmeno rispondere. Va contro il regolamento.
    Fusion

    Currency Text Box (Updated: 16 Maggio 2008): http://digilander.libero.it/cmfusion/CurrencyTextBox.html

  9. #9
    Originariamente inviato da fu510n
    non dovreste nemmeno rispondere. Va contro il regolamento.
    Non mi pare che ci sia mai stata una regola del genere... :master:
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200
    Originariamente inviato da KataKlism2002
    ...Si può rallentare, ma non mi è venuto in mente nulla che lo renda indipendente dalla velocità del processore. ...
    [/code]
    A mio avviso si tratta soltanto di capire a seconda della velocità del processore quale sia il valore N massimo da impostare per il ciclo.

    A spanne si potrebbe misurare tale velocità sapendo quanti incrementi la cpu riesce ad effettuare nel ciclo in questione in un periodo di tempo prefissato (es. 1ms).

    Fatto questo, si fanno le dovute proporzioni tra valore d'incremento ottenuto in 1 ms (poniamo essere Y) ed il tempo di pausa che si vuole generare. Se la pausa dovesse essere di 0,5 ms allora il valore N massimo del ciclo sarà Y/2.

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.