Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
  Στις 2/8/2014 στις 2:51 ΜΜ, albNik είπε

Δεν καταλαβαινω τι εννοεις "παλι τιποτα".

 

Αν βαλεις τη συνάρτηση σε timer θα καλειται περιοδικα.

Στη συναρτηση μπορεις εχεις κωδικα που αλλαζει π.χ. το κειμενο ενος label.

Τότε μάλλον κάπου έχει λάθος ο κώδικας μου.  :ph34r:

  • Απαντ. 73
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Δημοσ.
  Στις 2/8/2014 στις 2:55 ΜΜ, Giorgos3924 είπε

Τότε μάλλον κάπου έχει λάθος ο κώδικας μου.  :ph34r:

 

Καντο περιπου ετσι.

Καθε 2 δευτερολεπτα το label δειχνει τον αριθμό a αυξημένο κατα 1.

partial class Form1 : Form
{
	int a;
	public Form1()
	{
		timer.Interval = 2000; //2 seconds
		timer.Tick += timer_Tick;
		timer.Start();
	}

	private void timer_Tick(object sender, EventArgs e)
	{
		Test();
	}

	private void Test()
	{
		label1.Text = a++.ToString();
	}
}
Δημοσ.

Χωρίς την timer.Tick += timer_Tick;

δουλεύει.

Τώρα ένα περίεργο πράγμα:

Με 1000ms δουλεύει, με 100ms δεν δουλεύει :(


Μάλλον ο timer δεν είναι ο σωστός τρόπος.

Ίσως πρέπει να κάνω τη συνάρτηση να εκτελείται συνέχεια αλλά με μικρή καθυστέρηση.


Βρήκα τρόπο:

ο timer καλεί τη συνάρτηση,

η συνάρτηση πριν κάνει οτιδήποτε σταματάει τον timer και όταν τελειώσει η συνάρτηση, η τελευταία πρόταση ξεκινάει πάλι τον timer.

Αλλά Κάτι δεν μαρέσει.

Οι μεταβολές δεν είναι smooth κολάει το πρόγραμμα, σαν να γίνεται start stop ολόκληρου του exe  :-(

Μάλλον πρέπει να βγάλω την εγγραφή label από τη συνάρτηση και να την αντικαταστήσω με string και να ανανεώνω μόνο τη label με τον timer.

Δημοσ.
  Στις 2/8/2014 στις 3:57 ΜΜ, albNik είπε

Τι εχεις βαλει μεσα στη Load?

Μήπως κανει κατι χρονοβορο η συνάρτηση. 

Γραψε τον κωδικα της αν γινεται.

τίποτα. τα έβγαλα τώρα από εκεί.

Τώρα έβαλα 2 timer, ο ένας εκτελεί τη συνάρτησή μου.

και ο άλλος ανανεώνει το label.

Η συνάρτηση δεν γράφει στο label γραφεί σε string τώρα.

έτσι το πρόγραμμα δεν φαίνεται σαν να έχει frames αλλα ακόμα όταν καλείται η συνάρτηση το πρόγραμμα παγώνει.

 

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Δημοσ.

Σιγουρα η ftd() θελει καποιο χρονο αφου κανει open-read-write-close σειριακή θυρα. 

Επίσης η Thread.Sleep() απαγορευεται στο GUI. 

 

Θα σου προτεινα να ανοιγεις μόνο μια φορα στην αρχή την COM, να διαβαζεις περιοδικα τα δεδομενα που θες σε ενα νέο thread, και να τα περνας στη φορμα μεσω Control.BeginInvoke(). 

Δημοσ.
  Στις 2/8/2014 στις 4:24 ΜΜ, albNik είπε

Σιγουρα η ftd() θελει καποιο χρονο αφου κανει open-read-write-close σειριακή θυρα. 

Επίσης η Thread.Sleep() απαγορευεται στο GUI. 

 

Θα σου προτεινα να ανοιγεις μόνο μια φορα στην αρχή την COM, να διαβαζεις περιοδικα τα δεδομενα που θες σε ενα νέο thread, και να τα περνας στη φορμα μεσω Control.BeginInvoke(). 

Ναι στο τέλος έτσι θα γίνει, θα ανοίγει μια φορά και θα κλείνει στο τέλος.

Δηλαδή εσύ λες να ξαναβάλω το πρόγραμμα στη main και να περνάω τα δεδομένα στη φόρμα;

 

Κάτι άσχετο:

Δεν μπορώ να μετατρέψω string σε int.

Γράφω: Convert.ToInt32(string)

και στην εκτέλεση πετάει:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
Additional information: Η συμβολοσειρά εισόδου δεν είχε τη σωστή μορφή.
Δημοσ.

Φτιαξε μια κλαση Device

class Device
{
	public void Open() { }

	public void Close() { }

	public bool IsOpen { get; private set; }

	public string Process()
	{
		string monitor = "";
		//get data
		return monitor;
	}
}

Στη φορμα κανε αυτό

public Form1()
{
	Thread thr=new Thread(Process);
	thr.Start();
}
bool stop;
Device myDevice;
private void Process()
{
	myDevice = new Device();
	myDevice.Open();
	for(; ; )
	{
		if(stop)
			break;
		Thread.Sleep(1000);
		string s = myDevice.Process();
		label1.BeginInvoke((MethodInvoker)delegate { label1.Text = s; });
	}
	myDevice.Close();
}

Το string πρεπει να εχει μονο ψηφια

Δημοσ.
  Στις 2/8/2014 στις 5:45 ΜΜ, Giorgos3924 είπε

Η κλάση θα μπεί οπουδήποτε στο namespace?

Βαλτη σε νεο αρχείο (Add class) και θα εχει το ιδιο namespace της φορμας.

Δημοσ.

Προσπαθησε να σπάσεις την ftd σε Open, Process kai Close.

class Device
{
	int count;
	FTDI myFtdiDevice;
	public string OpenInfo { get; private set; }
	public void Open()
		{
			UInt32 ftdiDeviceCount = 0;
			FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;
			myFtdiDevice = new FTDI();
			ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount);
			if(ftStatus == FTDI.FT_STATUS.FT_OK)
			{
				OpenInfo = OpenInfo + "Number of FTDI devices: " + ftdiDeviceCount.ToString() + "\n";
				OpenInfo = OpenInfo + "" + "\n";
			}
			else
			{
				IsOpen = false;
				return;
			}

			// If no devices available, return
			if(ftdiDeviceCount == 0)
			{
				IsOpen = false;
				return;
			}

			// Allocate storage for device info list
			FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount];

			// Populate our device list
			ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList);

			if(ftStatus == FTDI.FT_STATUS.FT_OK)
			{
				for(UInt32 i = 0; i < ftdiDeviceCount; i++)
				{

					OpenInfo = OpenInfo + "Device Index: " + i.ToString() + "\n";
					OpenInfo = OpenInfo + "Flags: " + String.Format("{0:x}", ftdiDeviceList[i].Flags) + "\n";
					OpenInfo = OpenInfo + "Type: " + ftdiDeviceList[i].Type.ToString() + "\n";
					OpenInfo = OpenInfo + "ID: " + String.Format("{0:x}", ftdiDeviceList[i].ID) + "\n";
					OpenInfo = OpenInfo + "Location ID: " + String.Format("{0:x}", ftdiDeviceList[i].LocId) + "\n";
					OpenInfo = OpenInfo + "Serial Number: " + ftdiDeviceList[i].SerialNumber.ToString() + "\n";
					OpenInfo = OpenInfo + "Description: " + ftdiDeviceList[i].Description.ToString() + "\n";
					OpenInfo = OpenInfo + "" + "\n";
				}
			}
			// Open first device in our list by serial number
			ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber);
			if(ftStatus != FTDI.FT_STATUS.FT_OK)
			{
				IsOpen = false;
				return;
			}

			// Set up device data parameters
			// Set Baud rate to 9600
			ftStatus = myFtdiDevice.SetBaudRate(9600);
			if(ftStatus != FTDI.FT_STATUS.FT_OK)
			{
				IsOpen = false;
				return;
			}

			// Set data characteristics - Data bits, Stop bits, Parity
			ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_NONE);
			if(ftStatus != FTDI.FT_STATUS.FT_OK)
			{
				IsOpen = false;
				return;
			}
		}
	public string Process()
		{
			if(IsOpen)
			{
				string monitor = "";
				string dataToWrite = (++count).ToString();
				UInt32 numBytesWritten = 0;

				// Note that the Write method is overloaded, so can write string or byte array data
				ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten);
				if(ftStatus != FTDI.FT_STATUS.FT_OK)
				{
					// Wait for a key press
					// Console.WriteLine("Failed to write to device (error " + ftStatus.ToString() + ")");
					// Console.ReadKey();
					return;
				}



				// Check the amount of data available to read
				// In this case we know how much data we are expecting, 
				// so wait until we have all of the bytes we have sent.
				UInt32 numBytesAvailable = 0;
				do
				{
					ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable);
					if(ftStatus != FTDI.FT_STATUS.FT_OK)
					{
						// Wait for a key press
						// Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")");
						// Console.ReadKey();
						return;
					}

					Thread.Sleep(5);
				} while(numBytesAvailable < dataToWrite.Length);


				// Now that we have the amount of data we want available, read it
				string readData;
				UInt32 numBytesRead = 0;
				// Note that the Read method is overloaded, so can read string or byte array data
				ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead);
				if(ftStatus != FTDI.FT_STATUS.FT_OK)
				{
					// Wait for a key press
					// Console.WriteLine("Failed to read data (error " + ftStatus.ToString() + ")");
					// Console.ReadKey();
					return;
				}


				monitor = monitor + readData + "\n";
				return monitor;
			}
			return null;
		}
	public void Close() { myFtdiDevice.Close(); }
	public bool IsOpen { get; private set; }
}
Δημοσ.

Μισό λεπτό γιατί προσπαθώ να καταλάβω λίγο τι γίνεται γιατί δεν μ'αρέσει το copy paste  :-)


Γιατί να φτιάξω κλάση τύπου string και όχι να βάλω ένα string monitor ως public μέσα στην κλάση όπως η count και η myFtdiDevice

Δημοσ.
  Στις 2/8/2014 στις 6:27 ΜΜ, Giorgos3924 είπε

Μισό λεπτό γιατί προσπαθώ να καταλάβω λίγο τι γίνεται γιατί δεν μ'αρέσει το copy paste  :-)

Γιατί να φτιάξω κλάση τύπου string και όχι να βάλω ένα string monitor ως public μέσα στην κλάση όπως η count και η myFtdiDevice

 

Οκ μπορεις και ετσι.

Απλα η Process εκτελειται περιοδικα και αν αποτύχει τοτε η public monitor θα εχει την προηγουμενη τιμή (εκτος και αν της αναθεσεις null).

Επισης διαχώρισα την OpenInfo απο τη monitor.

 

Η count και myFtdiDevice δεν ειναι public (δεν χρειαζεται να τις γνωρίζει η φορμα). 

Δημοσ.
  Στις 2/8/2014 στις 6:39 ΜΜ, albNik είπε

Οκ μπορεις και ετσι.

Απλα η Process εκτελειται περιοδικα και αν αποτύχει τοτε η public monitor θα εχει την προηγουμενη τιμή (εκτος και αν της αναθεσεις null).

Επισης διαχώρισα την OpenInfo απο τη monitor.

 

Η count και myFtdiDevice δεν ειναι public (δεν χρειαζεται να τις γνωρίζει η φορμα). 

ναι σωστά είναι private

Στην     public string OpenInfo { get; private set; }

υπάρχει λόγος που έχεις την set private?

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...