Wielowątkowść nie odcina formy

Wielowątkowść nie odcina formy
0

Witam. Chciałbym się was zapytać jak tą wielowątkowość zrobić. Napisałem programik do sprawdzenia przy wysyłaniu requestów co sekundę non stop i dodałem taki kod dla odświeżania labela na formie
a - inkrementacja pętli, w której jest też request

Kopiuj
                this.Invoke(new MethodInvoker(delegate()
                    {
                        getA = a;
                        label1.Text = getA.ToString();
                    }));

Mimo tego, że taki kod jest dodany do odświeżania labela to przy spamowaniu requestami forma jest zacięta nadal, odcina się dopiero co jakiś czas. Jak mogę to zrobić tak aby requesty latały jak szalone a label odświeżał się bez względu na requesty? Z góry dzięki!

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 9 godzin
0

pokaż to "wysyłanie requestów co sekundę non stop".

0
Kopiuj
public void abc(int size)
{
    for(int a = 0; a < size; a++)
    {
     //request
    }
}
AL
  • Rejestracja:ponad 11 lat
  • Ostatnio:15 dni
  • Postów:308
0

no a jak tworzysz nowy wątek?

0
Kopiuj
public void abc(int size)
{
    for(int a = 0; a < size; a++)
    {
     this.Invoke(new MethodInvoker(delegate()
                    {
                        getA = a;
                        label1.Text = getA.ToString();
                    }));
        //dalej request
    }
}
edytowany 1x, ostatnio: somekind
Sarrus
podpowiedź: tu nie jest tworzony żaden wątek.
AL
  • Rejestracja:ponad 11 lat
  • Ostatnio:15 dni
  • Postów:308
0

widze, ze nie masz pojecia co to watki. lepiej poczytaj na google

T2
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Postów:194
0

Panu .Al chodziło o to że jak wywołujesz metodę ABC to powinieneś to wykonać z innego wątku inaczej forma ciągle będzie blokowana ponieważ będzie wykonywał to wątk Dispatchera. Czy wykonujesz tą operacje w taki sposób ? Jeżeli tak to pokaż kod , jeżeli nie to dopisz ten kod.

edytowany 1x, ostatnio: teo215
0

W ten sposób? Wywołuje metode abc (z innego wątku)?

Kopiuj
        private void button1_Click(object sender, EventArgs e)
        {
            this.Invoke(new MethodInvoker(delegate()
                {
                    abc();
                }));
        }

        public void abc()
        {
            //pętla i request
        }
Sarrus
Tu nadal nie ma wątków. Brakuje ci podstawowej wiedzy. Powinieneś ją najpierw uzupełnić. Forum nie jest od prowadzenia wykładów.
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
0

Nie.

Poczytaj do czego służy Invoke, a jak chcesz coś robić na wątkach to o TPL.

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Tak spróbuj:

Kopiuj
private void button1_Click(object sender, EventArgs e)
{
	ThreadPool.QueueUserWorkItem(delegate { this.abc(); });
}

public void abc()
{
	App.Current.Dispatcher.BeginInvoke(new Action(() => {
		for(int a = 0; a < size; a++)
		{
			getA = a;
			label1.Text = getA.ToString();
		}
	}));
}

Krótko: odpalasz metode this.abc() jako wątek w puli wątków. Wewnątrz tej metody pętla dotyka GUI więc musisz skorzystać z Dispatcher'a oraz BeginInvoke żeby GUI było aktualizowane. Każde kliknięcie przycisku odpala nowy wątek. o to chodziło? Tak nawiasem mówiąc to co się dzieje w Twojej pętli jest trochę bez sensu, bo nawet nie zdążysz zobaczyć zawartości label1.Text ale...

Reasumując:

Kopiuj
// Tworzenie wątku, a raczek skorzystanie z puli wątków systemu operacyjnego.
ThreadPool.QueueUserWorkItem(delegate { 
	// Tutaj czynności nie wymagające ingerencji w GUI.

	App.Current.Dispatcher.BeginInvoke(new Action(() => {
		// Tutaj aktualizacja GUI w wątku.
	}));
});
edytowany 2x, ostatnio: grzesiek51114
0

W sumie to chodziło mi tylko o to aby przy wysyłaniu requestów forma się nie zacinała bo akurat requestów leci około 4 tysięcy, zajmuje to z 10 min a przez ten czas forma jest zawieszona :/. Sam doszedłem do czegoś takiego, co prawda forma jest odcięta, normalnie w richTextBoxie moge pisać a requesty normalnie się wysyłają tylko problem z odświeżaniem labela.

Tutaj jest kod tworzenia nowego wątku:

                Thread threadMatch = new Thread(() =>
                {
                    Match(countCanta);
                });

                threadMatch.Start();

A początek metody Match wygląda tak:

Kopiuj
public void Match(int size)
        {
            for (int a = 1; a < size; a++)
            {
                getA = a;
                label4.Text = getA.ToString();
                ...

Jeżeli przyjdzie czas na nadpisanie label4 to występuje taki błąd:
Cross-thread operation not valid: Control 'label4' accessed from a thread other than the thread it was created on.

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
0

Wszystko masz napisane w komunikacie. Integracja z GUI nie może zachodzić z poziomu osobnego wątki, tak jak chcesz to zrobić. Żeby zadziałało trzeba użyć Dispatcher'a, o którym pisałem wyżej. Dlatego Ci nie działa.

Ty próbujesz aktualizować GUI z wątku, w którym GUI nie ma i dlatego masz problem. Nawiasem mówiąc powinien Ci się wywalić wyjątek. Jeżeli tak nie jest to w ogóle coś źle robisz. EDIT: Fakt, wywalił Ci się wyjątek. Przeca jest komunikat :)

edytowany 2x, ostatnio: grzesiek51114
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 9 godzin
0
Krzywy Krawiec napisał(a):
Kopiuj
public void abc(int size)
{
    for(int a = 0; a < size; a++)
    {
     //request
    }
}

przecież miało być co sekundę a tu się okazuje że wysyłasz wszystko na raz?

plątasz się w zeznaniach.

edytowany 2x, ostatnio: Azarien
grzesiek51114
grzesiek51114
To już w ogóle swoją drogą :)
0
Azarien napisał(a):
Krzywy Krawiec napisał(a):
Kopiuj
public void abc(int size)
{
    for(int a = 0; a < size; a++)
    {
     //request
    }
}

przecież miało być co sekundę a tu się okazuje że wysyłasz wszystko na raz?

plątasz się w zeznaniach.

Nie bierz tego dosłownie, chciałem przez to powiedzieć, że requesty lecą jeden za drugim i forma się zacina.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 9 godzin
0

Nie bierz tego dosłownie, chciałem przez to powiedzieć, że requesty lecą jeden za drugim i forma się zacina.

No ale jak nie pokazujesz kodu prawdziwego, tylko jakieś //request, to jak mamy ci pomóc?

Co wysyła te "requesty"? Dlaczego one się generują - czy to jakiś timer jest, czy aktywność sieciowa...

InvokeRequired i Invoke rozwiązuje problem z dostępem do kontrolek z innego wątka.
Ale jeżeli u ciebie się forma zawiesza, to znaczy że główny wątek jest zajęty. Nie można tak sobie zrobić długotrwałej pętli w głównym wątku programu i jednocześnie mieć responsywnego GUI, bo kiedy ma się wykonać kod odpowiedzialny za GUI, skoro jest w tym samym wątku?
Pewnym półśrodkiem jest Application.DoEvents(), ale raczej trzeba kod przerobić tak, by DoEvents nie było potrzebne.
Być może najlepszym rozwiązaniem w twoim przypadku w ogóle nie są wątki, tylko async/await.

Ale kodu nie chcesz pokazać, tylko piszesz że "requesty lecą".
No to jak lecą to lecą...

Astrocyt
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:17
0

Ale czy nie najlepiej zrobić to po prostu na zwykłym Task'u ? Po co się bawić w takiej sytuacji w BeginInvoke ?
Pozdr.
Astrocyt

SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
0
Astrocyt napisał(a):

Ale czy nie najlepiej zrobić to po prostu na zwykłym Task'u ? Po co się bawić w takiej sytuacji w BeginInvoke ?
Pozdr.
Astrocyt

Invoke jest do tego, żeby zaktualizować kontrolkę z innego wątku.

0

A BackgroundWorker ci nie wystarczy? Wszystko zrobi za ciebie, tylko podłączyć się pod odpowiednie zdarzenia

T2
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Postów:194
0

W zupełności by wystarczył ale dobrze wiedzieć jak to działa pod spodem :)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)