Kört fast i C#
Postat: 17 juni 2009, 21:59:16
Hejsan!
Ni kanske minns att jag tidigare sökte ett styrsystem för projektorer och kringutrustning. Jag hittade inget som jag gillade så det vart till att koda eget istället. Och nu har jag stött på problem.
först koden, sen problemet
COM.CS
och Form1.CS
Som ni ser finns det i com.cs två klasser. Klassen Hello skickar först ut "Hello" på COM1, för att sedan, 2 sekunder senare skicka ut "Tjosilosan" på samma port. Så långt funkar det bra.
Klassen World skickar bara ut "World" på COM1. Den funkar också finfint.
Men om jag nu kör båda samtidigt, alltså det som händer när jag trycker på button4, då fryser thread.freeze alltihop så att det som kommer in i hyperterminal blir
Mellan att Hello och Tjosilosan dyker upp går det alltså två sekunder, och World kommer direkt efter Tjosilosan.
Det är alltså inte så jag vill ha det, jag vill inte att World ska vänta med att skickas, utan den ska komma in samtidigt som Hello, och sen, 2 sekunder senare dyker Tjosilosan upp.
Jag försökte lösa det med hjälp av multithreading, men utan någon vidare lycka. Jag tänkte att då skulle thread.freeze bara frysa Hello, och inte World, men så är inte fallet.
Ni kanske minns att jag tidigare sökte ett styrsystem för projektorer och kringutrustning. Jag hittade inget som jag gillade så det vart till att koda eget istället. Och nu har jag stött på problem.
först koden, sen problemet
COM.CS
Kod: Markera allt
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
namespace WindowsFormsApplication1
{
class com
{
public void Main(string[] args)
{
ThreadStart tsHello = new ThreadStart(Hello);
ThreadStart tsWorld = new ThreadStart(World);
Thread tHello = new Thread(tsHello);
Thread tWorld = new Thread(tsWorld);
tHello.Start();
tWorld.Start();
tHello.Join();
tWorld.Join();
}
public void Hello()
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("Hello");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
Thread.Sleep(2000);
port.Write("Tjosilosan");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
public void World()
{
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write("World");
port.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3);
port.Close();
}
}
}
Kod: Markera allt
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
com myCom = new com();
public void Main(string[] args)
{
ThreadStart tsHello = new ThreadStart(myCom.Hello);
ThreadStart tsWorld = new ThreadStart(myCom.World);
Thread tHello = new Thread(tsHello);
Thread tWorld = new Thread(tsWorld);
tHello.Start();
tWorld.Start();
tHello.Join();
tWorld.Join();
}
public Form1()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
myCom.Hello();
myCom.World();
}
}
}
Klassen World skickar bara ut "World" på COM1. Den funkar också finfint.
Men om jag nu kör båda samtidigt, alltså det som händer när jag trycker på button4, då fryser thread.freeze alltihop så att det som kommer in i hyperterminal blir
Kod: Markera allt
Hello
â Tjosilosan
â World
â
Det är alltså inte så jag vill ha det, jag vill inte att World ska vänta med att skickas, utan den ska komma in samtidigt som Hello, och sen, 2 sekunder senare dyker Tjosilosan upp.
Jag försökte lösa det med hjälp av multithreading, men utan någon vidare lycka. Jag tänkte att då skulle thread.freeze bara frysa Hello, och inte World, men så är inte fallet.