Komunikacja między wątkami

0

Witam mam taki oto problem:
user image

Mam główny serwer/program Windowsowy, który wywołuje główny wątek zarządzający połączeniami TCP. Gdy nadejdzie połączenie TCP tworzy on pod wątek(WatekTCP). Każdy z podłączonych klientów czeka na polecenie od serwera może być one wydane nawet po bardzo dużym odstępie czasu.
Moje pytanie brzmi w jaki sposób z poziomu formatki kazać wątkowi wykonać np jakąś metodę.

Inaczej mówiąc, ktoś się podłącza do serwera, tworzony jest wątek który rozmawia z serwerem, potem ten wątek przechodzi w stan "spania". Poprzez przyciśnięcie przycisku na formatce serwera budzimy wątek i każemy mu wykonać jakąś metodę.

Wątki już działają, ale nie wiem jakim poleceniem wprowadzić obecny wątek w tryb "spania", oraz jak poszczególnemu wątkowi kazać wykonać jakąś metodę.

0

SOLVED:

Thread.Sleep(Timeout.Infinite);
WatekGlowny.Interrupt();
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.Threading;
using System.IO;


namespace Threads
{
    public partial class Form1 : Form
    {
        Thread WatekGlowny;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ThreadStart watekx = new ThreadStart(MetodaWatku);
            WatekGlowny = new Thread(watekx);
            WatekGlowny.Start();
        }
        public void MetodaWatku()
        {
            Console.Beep(100, 100);
            try
            {
                Thread.Sleep(Timeout.Infinite);
            }
            catch (ThreadInterruptedException ex)
            {
                Console.Beep(1000, 1000);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WatekGlowny.Interrupt();
        }
    }
}
0

Ale to chyba nie rozwiązuje problemu "jak kazać wątkowi wykonać metodę".

enum Actions{
  DoNothing,
  Foo,
  Bar,
  Terminate
}

Actions NextAction { get; set; }

public void MetodaWatku()
        {  
            Actions action = Actions.DoNothing;
            do            
            {
                action = NextAction;
                switch(action) {
                   case (Actions.Foo) : Foo(); break;
                   case (Actions.Bar) : Bar(); break;
                }
                Thread.Sleep(1000);
            }
            while(action != Actions.Terminate)
            Console.Beep(1000, 1000);  
        }
0

użyj w głównej funkcji wątku prostą pętlę:

while(!martwy){
  if(uspiony){
    Thread.Sleep(100);
  }else{
    //Zrob cos
    uspiony = true;
  }
}

Widze Hass szybciej piszesz niż ja. Dodam jeszcze tylko, że możnaby użyć delegacji zamiast funkcji, wtedy można dać wątkowi do wykonania niemalże każdą funkcje (jedyne ograniczenie to przyjmowane argumenty).

0

Ale rozwiązanie z metodą Interrupt będzie najlepsze. Nie zawsze wpychanie niekończących się pętli i sprawdzanie czegoś co ileśtam milisekund jest dobre.

1 użytkowników online, w tym zalogowanych: 0, gości: 1