#6 ingiraxo
Nevies mi poradit ako by som spravil v mojom pripade to async citanie ?
Příspěvky odeslané z IP adresy 85.237.239.–
Zdravim.
Chcem sa opytat ci da pozastavit beh programu. Predstavoval by som si to asi takym sposobom, ze sa mi vykonava urcity zdrojovy kod cize jedna instrukcia za druhou a dajme tomu zeby som chcel medzi urcitymi instrukciami asi 5 sekund pauzu.Cize program sa pozastavi dajme tomu na 5 sekund a znova pokracuje. Dakujem
#7 Evzen
To co som pisal hore to ine riesenie ako mas ty tak nefunguje moc. Chybu sice nehlasi ale nezmeni premenne vobec ako potrebujem. Skusam to tvoje riesenie a mam stym trosku problem.
Neviem ci som to mal dopisat ale na koniec do formu som dopisal
public interface IForm
{
void initial_value();
}
a pod to som dopisal
public class Form : IForm
{
public void initial_value()
{
listen.Text = "Listen";
listen.BackColor = Color.Lime;
textLp.Enabled = true;
textRp.Enabled = true;
textIp.Enabled = true;
textSend.Enabled = false;
}
}
Ako vravim neviem ci som to mal dopisat pretoze vyssie mam napisane public class Form1:Form .
A pri tychto premennych mi vypisuje ze su non static.
Do triedy mam zapisat:
public IForm Form { get; set; }
upravit konstruktor a zapisat do neho toto :
public MyClass(IForm form) { Form = form; }
public void DoWork()
{ try { // do something }
catch (Exception)
{ Form.initial_value(); } }
Lenze mne ten program ide ked ho spustim normalne cez VS ale ked potom premiestnim tu ikonku .exe zo zlozky kde si uklada VS a dam ju napriklad na plochu tak program spusti ale nefunguje. Potrebuje mat zo sebou subor s koncovkou .pdb ..... chcel by som aby tam na ploche napr. bol len jeden .exe subor.
#8 liborb
Aha takze toto
client = new UdpClient(localPort)
sa robi iba pri localnom porte na ktorom chcem pocuvat a nemusim vytvarat clienta pre port kde odosielam.
Preto ja som mal vytvoretene client = new UdpClient(remotePort) kde remotePort bola hodnota portu kde to druhe zariadenie prijima.
A to zariadenie ktore mam dokaze aj prijimat data ale aj odosielat. Problem je ale v tom ze ked prijimam data nemozem ich rovno odoslat ale musim zastavit prijimanie, odoslat data, a znovu zacat prijimat data. Nedokaze to robit naraz.
#6 liborb
Dakujem ti za pomoc pretoze som sa s tym uz velmi dlho hral a nemohol som prist na to kde mam problem. No asi mas pravdu ze som to zle pochopil. Takze v podstate ak to teraz dobre chapem tak pri pocuvani cez UDP si musim vytvorit:
client = new UdpClient(localPort);
A potom pocuvat data teda ich prijimat.
A ak chcem odosielat tak musim to spravit tak ako si napisal.
Ale nepochopil som preco tam nema byt toto
client = new UdpClient(remotePort);
#4 liborb
No pretoze mam dve rozdielene premenne kde si ukladam cisla portov. To znamena ze mozem pocuvat a zaroven prijimat na rozdielnych cislach portov. Tak preto si clienta zavriem pre prijem a vytvorim si noveho pre odoslanie. Tak preto to zacianm tym.
#2 liborb
public void listen()
{
client = new UdpClient(localPort);
host = new IPEndPoint(IPAddress.Any, 0);
while (Form1.button==true)
{
received = client.Receive(ref host);
receivedString = Encoding.ASCII.GetString(received);
writer = new StreamWriter(pathDesktop + @"\CLI_Log.txt", true);
writer.Write(receivedString);
writer.Close();
tb.Invoke((MethodInvoker)delegate()
{
tb.AppendText(receivedString);
});
}
}
No takze tuto metodu listen si spustam vo vlakne kde mi stale vycitava data cez UDP protokol. To vlakno si mozem pozastavit a znova spustit a stale mi to funguje.
Ako nahle si zavolam metodu pre odoslanie tak mi data odosle ale hore pri clien.receive() mi vybehne ze je blokovany.
Metoda send vyzera takto:
public void send()
}
client.Close();
remoteEndPoint = new IPEndPoint(ip, remotePort);
client = new UdpClient(remotePort);
sendBytes = Encoding.ASCII.GetBytes(command + "\r\n");
client.Send(sendBytes, sendBytes.Length, remoteEndPoint);
}
A vo forme si musim najprv zastavit vlakno odoslat data a znova spustit vlakno pretoze to zariadenie s ktorym komunikujem vie len bud prijimat data alebo odosielat nie naraz.
Vo forme to vyzera takto:
com.t.Suspend();
com.send();
com.t.Resume();
com je objekt triedy communication
#3 KIIV
Zdravim
Zistil som preco to nejde. Zariadenie s ktorym komunikujem cez UDP nedokaze naraz odosielat aj prijimat data, cize ak odosielam data tak prijimanie musim zastavit. Ak som to nezastavoval tak mi vybehla chyba tam kde som pisal vyssie. Problem je ale v tom ze mam spustnene vo vlakne to pocuvanie cez UDP a je tam podmienka while kde dookola vycitava data. Ak chcem zastavit cez thread.suspend() tak mi to nezastavi vlakno. Neviem ci by som tam nemal dat nejaku podmienku if() a do tela tej podmienky dat break. Cize ak pride sa splni nieco vyskoci z podmienky a dokonci sa vlanko. No cez ten suspend by som radsej bol pretoze by to bolo aj uhladnejsie.
Chcel by som sa opytat na nejake rady ohladom optimalizacie programu alebo teda programov. Ide konkretne o to aby co najmenej zatazovali procesor. Su nejake typi alebo rady ako to docielit? Myslim tym napr. nejake definovanie premennych ale zjednodusovanie cyklov a tak. Dakujem za odpovede
Zdravim
Prijimam data cez udp a to je spustene vo vlakne. Ak potrebujem data odoslat tak pozastavujem vlakno odoslem data a znova hned spustim vlakno no pri znovu spusteni mi vypise "A blocking operation was interrupted by a call to WSACancelBlockingCall".
v riadku kde je chyba mam napisane toto:
received = client.Receive(ref host);
Mam triedu v ktorej mam metodu ktoru si spustam vo vlakne:
class communication
{
public communication()
{
t = new Thread(new ThreadStart(listen));
}
public void listen()
{.......}
}
Vo forme potrebujem v jednej udalosti vlakno zastavit a znova spustit.
Robim to takto ze vo forme si vytvorim
communication com=new communication();
a potom spustam com.t.Start();
takto sa mi vlakno rozbehne ale ak dam com.t.Abort(); tak mi ho nezastavi.
Ako to mam zastavit ?
#5 JardaJirava
A co mam rozpisane to tlacidlo ..... tak jednym tlacidlo aj spustam aj zastavujem a potom si to kontrolujem v podmienke if ci je true alebo false a podla toho potom spustam vlakno alebo zastavujem.... nevies mi poradit preco vlakno nezastavi a akym sposobom h zastavit ..... zdrojak je vyssie
#2 JardaJirava
No spravil som to nejako podobne ale ako to spustam vo vlakne tak mam problem a to taky ze mi vypise chybu "cross thread operation no valid"..... takze ja vlastne v triede A ukladam retaze receivedString do vytvoreneho textboxu a spustam vo vlakne..... skusal som funkciu lock aby mi uzamkla textbox kym ho pouzivam v metode ale nefunguje to a neviem ako to spravit .... este som to skusal cez metodu invoke ale ani to mi nefunguje a neviem ako to mam spravit aby mi to slo spustit.Samozrejme potom potom tu metodu celu volam vo Form1 kde to ma bezat na pozadi.
Mam takyto kod
class A
{
public string listen()
{
client = new UdpClient(LocalPort);
IPEndPoint host = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
if ((client.Available > 0))
{
byte[] received = client.Receive(ref host);
string receivedString = Encoding.ASCII.GetString(received);
return receivedString;
}
}
}
}
Tato metoda hore nerobi nic ine v triede iba pocuva na porte a vracia string.
Potrebujem aby tato metoda bezala vo vlakne a aby sa hodnota stale zapisovala do textboxu vo forme1 z triedy A.
Zdravim mam taky mensi problem. Mam textbox do ktoreho si zapisujem obsah retazca ktory je kazdy chvilu aktualizovany teda meneny a ja potrebujem to dostat do druheho formu aby som vedel analizovat konkretne data ktore pridu v isty okamih ..... ci potrebujem aby sa mi menila tak ta premenna teda string aj v druhom forme kde to budem analyzovat. Dakujem za vsetky rady
Mam takyto kod >
string pathDesktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //zistenie cesty na plochu
StreamWriter writer = new StreamWriter(pathDesktop + @"bla bla", true);
writer.Write(e.UserState as String);
writer.Close();
Chcem sa opytat ci tam mam dat blok try a catch alebo nie. Ide mi o to ze v podstate ak existuje subor zapisuje rovno do neho a ak neexistuje tak si ho vytvori ..... moze tam nastat nejaka nepredvidana udalost ? mal by som to osetrit
Mam lokalne zadefinovane
UdpClient client = new UdpClient();
a potom si po stlaceni tlacidla kontrolujem
try
{
client=new UdpClient(nejake cislo portu)
}
catch
{
nejaky messagebox
}
ale problem je v tom ze pouzivam tu definiciu client aj v inych tlacidlach a textboxoch cize udalostiach ale tam to uz nepozna ... ako to mam zadefinovat
#3 velurex
private void enterCommand(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == Convert.ToChar(Keys.Enter))
{
worker.CancelAsync();
string Ip = textIp.Text;
int RemotePort = int.Parse(textRp.Text);
IPEndPoint RemoteEndPoint = new IPEndPoint(IPAddress.Parse(Ip), RemotePort);
int line = textSend.GetLineFromCharIndex(textSend.SelectionStart);
string command = textSend.Lines[line];
client.Close();
client = new UdpClient(RemotePort);
byte[] SendBytes = Encoding.ASCII.GetBytes(command + "\r\n");
client.Send(SendBytes, SendBytes.Length, RemoteEndPoint);
e.Handled = true;
worker.RunWorkerAsync();
}
No potrebujem aby sa prerusilo prijimanie dat cez UDP na zaciatku cize tam mam worker.CancelAsync() a potrebujem aby som odoslal byte a znovu zacal prijimanie cez UDP a na konci mam worker.RunWorkerAsync() ale proste pise ze je zaneprazdneny.
#3 velurex
Ten RunWorkerAsyc ide praveze spustat viac krat pretoze na tlacidle ked stlacim mam spustenie workra a dalsim tlacidlom zastavim a tak to mozem robit dookola...... no ked si dam nachvilku ho zastavit vykonat nejake operacie a hned spustit ked je to pod sebou tak to nejde
#2 JardaJirava
No ano to som si vsimol ze asi tymto by som to mal riesit ale problem je v tom ze neviem sa pohnut z miesta.... kked si vytvorim udalost na enter pretoze chcem ak si vyberiem slovo a dam enter tak vtedy si ho vyberiem.... tak neviem potom pouzit tie dve metody
Zdravim
Cyklicky sa mi zapisuju retazce do suboru textoveho a po takej pol hodine je uz ten textovy subor dost velky.... chcel by som nejaky iny zapis alebo kompresovany ale tak aby sa to dalo uzivatelsky jednoducho otovrit. Ak mate nejake napady tak dakujem.
Chcem spravit button ktory ked stlacim tak mi bude prijimat data z jedneho zariadenia pomocou UDP a ak ho stlacim druhy krat tak prestane ale neviem ako to mam spravit. Prv by pisalo Pripoj na tom tlacidle a prijimalo data a potom ako by bolo pripojene by pisalo odpoj. Dakujem za pomoc
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace skuska
{
class Program
{
static void Main(string[] args)
{
byte[] bufferBytes = new byte[32];
UdpClient client = new UdpClient();
client.Connect("192.168.62.6", 3030);
Byte[] sendBytes = Encoding.ASCII.GetBytes("nejaky prikaz");
client.Send(sendBytes, sendBytes.Length);
client.Close();
}
}
}
mam tu nikde chybu ?
#7 ingiraxo
Ale nemusel by som tu druhu uz hotovu aplikaciu upravit na to aby prijimala data po nejakom porte ktore budem posiela z programu ktory spravim ? chcel by som len nejako spravit aplikaciu a ta aby mala pristup dajme tomu k funkciam toho druheho programu ktore by len volala a ten druhy program by to vykonal
Zdravim. Potreboval by som napisat aplikaciu alebo teda program ktory by nejakym sposobom riadil iny program. To je ze potrebujem nejaky program ktory da prikaz inemu programu a potom si aj vysledok nacita a zisti ci je to spravne ... cize akoby nejaky tester..... dakujem kto mi pomoze