Vă mulțumesc foarte mult!
Eroarea este elementară, dar nici măcar nu m-am uitat la ea, m-am gândit că nu cunosc niciun element de bază în transferul de date pentru a funcționa principal (), și nu le-am putut găsi eu pe Internet. În general, dintr-un anumit motiv, oamenii scriu roboți practic fără a folosi funcția main () și funcția OnInit (), deși, în măsura în care înțeleg, acest lucru este suficient de important pentru viteza execuției.
Întotdeauna te rog! În general, nu-mi pot imagina cum să scriu un robot fără principalele 🙂 La sfârșitul acestui articol am adăugat un mic basm despre acest lucru 🙂 Citiți, vă rog, sper că veți înțelege multe lucruri.
pentru care funcția funcției OnInit () este necesară?
daca scriu acelasi lucru chiar inainte de main, nu in nici o functie, tastati t = 0, dt1 = os.date ("* t"), etc. decât diferă de cea înregistrată în OnInit ()? poate un exemplu?
Funcția OnInit este trecut calea completă către script-ul (odată ce este necesar), totuși nu se poate, de exemplu, utilizați funcția CreateDataSource în corpul de script-ul, și alte funcții în corpul de script-ul nu va funcționa, dar eu nu cunosc toate listă. Aici, în general, trebuie să vă certați mai ușor, dacă aveți suficientă funcționalitate pe care o aveți, atunci nu vă complicați viața. Personal, aproape că nu folosesc niciodată această funcție.
Bună, Dmitry. Nu este adevărat al tău, CreateDataSource se numește în mod normal și fără OnInit, ca în alte și alte funcții enumerate în manual.
Bine ai venit!
Funcția de somn funcționează întotdeauna corect, întrerupe firul în care este executată. Funcția principală este un fir (separat de cel principal), toate funcțiile care vor fi chemați de la funcția principală vor funcționa și în afara firului principal.
Restul este un alt fir (fluxul principal al terminalului).
Diferența dintre funcția de somn și cea pe care o oferiți este că atunci când este sunat somnul, procesorul oprește procesarea fluxului în care este apelată această funcție, iar în versiunea dvs. încărcați acest fir contrar. Pentru a înțelege ce vorbesc, rulați acest script:
Despre sarcina de pe CPU este de acord. Într-adevăr, crește de multe ori.
Nu înțeleg despre flux - pot să o fac din nou? Terminalul în sine este executat într-un fir, principal - în celălalt. Și ce zici de funcțiile chemate din principală? În general, toate celelalte funcții sunt în cele din urmă numite prin intermediul principalului. Și ei, așa cum o înțeleg, sunt executați în același flux cu terminalul însuși.
Odată ce a existat un caz - a scris un scenariu și din anumite motive somnul nu a funcționat în funcția chemată. Așa că și-a scris propria lui. Acum am urmărit ambele opțiuni - nu am văzut o diferență, cu excepția încărcării procesorului. Aparent, atunci m-am înșelat în ceva.
În general, sunt de acord, e mai bine să nu folosiți opțiunea mea.
Terminalul în sine și toate funcțiile script de apel invers funcționează într-un singur fir, astfel încât script-ul ar putea face unele calcule intensive și, astfel, terminalul nu este „agățat“, dezvoltatorii au făcut astfel încât funcția principală creează un fir separat care face nu va încetini fluxul principal al terminalului. Pentru a explica funcțiile chemate de la principal, voi da același exemplu:
Dacă îl executați, veți vedea în managerul de activități că utilizarea procesorului a crescut, deoarece principal utilizează Sleep, dar terminalul reacționează la acțiunile utilizatorului, deoarece Sleep este executat într-un fir separat de terminal (numit principal). Dar când opriți scriptul, Sleep nu va fi chemat într-un fir principal separat, dar, practic, așa cum am scris mai sus, toate funcțiile de apel invers sunt executate în firul principal și OnStop nu este o excepție. Este important să înțelegem următoarele, o funcție este o instrucțiune scrisă în memorie, în sine ea nu face nimic. Când terminalul se execută un script, terminalul este în script-ul, funcția principală, el știe că aveți nevoie pentru a crea un curent principal separat, se creează și începe să-și exercite toate instrucțiunile scrise în principal, care este, pentru fiecare script există un fir principal separat. De asemenea, atunci când scriptul este inițializat, terminalul analizează ce funcții On-are în scenariu și le memorează, funcțiile de apel invers nu sunt altceva decât abonamente la evenimente care apar în terminal.
Și terminalul operează în propriul său fir, care rulează în paralel cu firul principal script-uri care rulează, dintr-o dată în terminal există un eveniment, la fel ca în exemplul nostru, utilizatorul apăsat „Stop“, terminalul știe că script-uri pot înscrie pentru acest eveniment cu ajutorul funcțiilor OnStop terminalul știe deja că scriptul oprit sa înscris la acest eveniment și execută instrucțiunile scrise în funcția OnStop și le execută în firul său, iar firul principal continuă să funcționeze în paralel, fără a suspecta nimic. Dar, în timp ce executa OnStop a schimbat termen variabilă la nivel mondial, în timp ce ciclul sa oprit, funcția principală este să urmați instrucțiunile din prescris, fluxul de nimic principal mai mult a fost făcut, a concluzionat el, și, astfel, a finalizat scenariul, deoarece script-ul acesta este fluxul principal .
A devenit mai clar?
Dmitry, multe mulțumiri pentru răspunsul detaliat. Totul a devenit foarte clar!