Utilizarea reîncărcării stivei () - stivă în limba rusă

Bine ați venit în lumea fascinantă a programării UI! Va trebui să reînvățați puțin: aici totul nu este același lucru ca în programele liniei de comandă. Aici, toate sarcinile de fundal asociate cu interfața nu apar imediat, de îndată ce comandați, dar intercalate cu munca dvs. Toate acestea se întâmplă într-un fir fix, așa-numitul thread-ul UI.







Ce se întâmplă în codul dvs.?

  1. Blocați fluxul UI timp de o jumătate de secundă, apoi setați textul butonului. Un steag intern este setat în biblioteca grafică, care spune că "când există un minut liber, trebuie să actualizați butonul".
  2. Imediat blocați fluxul UI pentru o jumătate de secundă și resetați textul butonului. Din moment ce "minutul liber" (este acelasi "bucla inactiv") nu a venit niciodata, textul nu a avut timp sa se actualizeze. În plus, pentru timpul de blocare, nu există nimeni care să se ocupe de evenimente de la mouse și tastatură (deoarece thread-ul UI este ocupat de somn), astfel încât programul pare să plutească.
  3. Apoi, instalați din nou textul butonului, nu schimbă nimic, deoarece steagul care indică necesitatea unei actualizări este deja angajat.
  4. Și așa mai departe, de 11 ori.
  5. În cele din urmă, după încheierea ciclului dvs., firul UI este în cele din urmă eliberat și vă poate schimba. În sfârșit, vezi 0.






Care este esența problemei? Nu trebuie să efectuați operațiuni lungi în firul UI. Thread.sleep este o astfel de operațiune, dar multe, de asemenea, citi fișiere, încărcați date din rețea sau accesați baza de date. Aveți dreptul să descărcați firul UI numai pentru câteva milisecunde. Pentru durata unei operațiuni de lungă durată care rulează într-un fir UI, aplicația va arăta foame, iar agenții de procesare a evenimentelor UI nu vor fi chemați. Acest comportament al programului îl transformă imediat într-o meserie de student.

Actualizând interfața utilizator, răspunzând mouse-ului, reproiectând comenzile - totul se întâmplă în firul UI, într-un moment în care acest fir nu este ocupat. Un program UI bun ar trebui să fie orientat către eveniment, nu imperativ: nu trebuie să conduci singur programul, ci să reacționați doar la evenimente cu operatori de scurtă durată.

Ce ar trebui să fac? Există două moduri. O cale simplă care este potrivită pentru scopurile dvs.: nu blocați fluxul UI, dar utilizați cronometrul care vine cu biblioteca UI. Acesta va apela manualul dvs. la momentul potrivit, veți seta textul butonului acolo și veți termina procesarea. astfel încât să eliberați fluxul UI astfel încât acesta să poată actualiza interfața utilizator.

O cale complexă care se aplică dacă într-adevăr trebuie să efectuați o operațiune lungă. În acest caz, creați un fir separat (fir), în care efectuați operația dorită. Trimiteți rezultatele lucrării la fluxul UI la momentul potrivit, care ar trebui să actualizeze UI-ul. Rețineți că, în acest caz, programarea devine mult mai complicată, deoarece va trebui să aveți grijă de sincronizări, blocări și comunicare între fire (doar o variabilă globală nu se rotește). Dar pentru cazul dvs. acest lucru este de prisos, cronometrul simplu va fi suficient.







Articole similare

Trimiteți-le prietenilor: