• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    MORMEGIL: Jo mas pravdu, musis prepsat i to "==", zapomnel jsem to tam pripsat. Bylo prepsane oboje.
    MORMEGIL
    MORMEGIL --- ---
    To je nějaká divná historka. Přepsání metody Equals samo o sobě nijak neovlivní chování operátoru ==. Pokud někdo napsal operátor == tak, že jenom volá to Equals na levém objektu, pak to ovšem chcípne na NullReferenceException (ve tvém případě nullového myArgument; ostatně Equals(null) musí vždy vracet false). V nějakém složitějším případě je pak chyba někde jinde.

    Každopádně takováhle implementace Equals je blbě prostě proto, že to neplní kontrakt metody Equals, protože nikdy nevrátí true, které je však povinnou návratovou hodnotou pro x.Equals(x).
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    MORMEGIL: A co teprve, kdyz nekdo udela:
    public override Equals(object obj) {return false; }

    Jednou jsem se s tim setkal. Divil jsem se jaktoze se mi nevyhodi "ArgumentNullException" pri:
    if(myArgument == null) { throw new ArgumentNullException("myArgument"); }

    Od ty doby svedomite pouzivam object.ReferenceEquals(,) nebo na malejch osobnich toolech "X.IsNull()".
    MORMEGIL
    MORMEGIL --- ---
    TENCOKACISTROMY: A aby člověk měl co poslat na hovnokod.cz
    BRAP242
    BRAP242 --- ---
    dik za tip! jedinej problem, je ze je tam limit, ze ta plachta kterou to vytiskne nemuze bejt vetsi nez 2000 mm (2 metry) - nevite proc, pripadne jak vytisknout nejakou megaplachtu do PDF?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    NECROMAN: Na vytvareni blbe se hledajicich bugu? :)
    NECROMAN
    NECROMAN --- ---
    muze byt k necemu dobra tato prasarna - pretizit GetType() :)
    public class Foo
    {
        public new Type GetType()
        {
            return typeof(string);
        }
    }
    CERMINEK
    CERMINEK --- ---
    VIRTUALVOID: souhlasím s Bullzipem - používám ho již několik let a je to s nám paráda!
    VIRTUALVOID
    VIRTUALVOID --- ---
    Bullzip pdf printer je celkom fajn
    BRAP242:
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    BRAP242: ve windows si muzes nainstalit takovou tu XPS virtualni tiskarnu. nebo jsou takovy ty virtualni tiskarny do pdf.
    BRAP242
    BRAP242 --- ---
    mam dotaz: potrebujeme odladit tisk na velkej plotter - nenapada vas nekoho, jak si udelat virtualni tiskarnu ktera dokaze tisknout na "custom" velikost papiru?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    LOOCAS: V tom pripade zadnou synchronizaci mezi vlakny potrebovat nejspis nebudes :). A staticky promenny uz vubec :).

    Ty sitovy tridy bych se trochu bal v tom MaxScriptu pouzivat. Nejsem si jistej, jak se chova k uvolnovani objektu - a zrovna TcpListener a TcpClient pouziva zdroje primo z OS. Bal bych se, ze by se pak ten tcplistener ci tcpclient patricne neuvolnil a nechal by si vyclenenej dotycnej port.

    Ale muzu se mylit, chtelo by to prostudovat dokumentaci a vyzkouset si, jak se to chova pri vyhozenejch vyjimkach apod...
    LOOCAS
    LOOCAS --- ---
    Díky!

    Jinak já to nepoužívám v žádnym UI. Navíc ani v C#, ani v IronPythonu. Volám .net třídy a objekty z maxscriptu a běží to celý v rámci tý hostující aplikace. Ty příkazy pak bude zpracovávat přímo maxscript.

    Chtěl jsem to nejdřív vyzkoušet v IronPython konzoli a pak ten kód "přeložit" do maxscriptu a dál s tim pracovat.

    Proto mi to taky tak trvá a jsem v tom trochu ztracenej. :) C# neovládám, jen ho jakž takž dokážu číst (s obtížema).
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    TENCOKACISTROMY: Jinak tohle cely martirium se da zkratit pomoci extension-methods. ControlExtensions.RunInUIThread(this Control self, Action action).

    Pouziva se to pak podobne (ale imho jednoduseji) jako Invoke():
    this.RunInUIThread(()=> {
        // tento kod jiz pobezi v UI threadu
    });
    
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    KEDRIGERN: Staticke promenne ne! To je 3x fuj a jeste navic spatne!

    LOOCAS: Stejne jako kazdy jiny multithreading ve winforms (predpokladam, ze pouzivas winforms - nebo wpf?)

    Kdyz to budes mit ve formu (je to stejny v usercontrolu, panelu, atd...), tak napriklad takto:
    public class MyForm : Form {
        // ... bla bla bla ...
        void BackgroundWorker_DoWork() {
            var listener = .....
            using(var tcpClient = listener.AcceptTcpClient()) {
                // ... ziskani dat
    
                // mujDelegatProUI = anonymni funkce, ktera se ma spustit v UI vlakne
                Action mujDelegatProUI = ()=> {
                    // tento kod uz pobezi v UI vlakne
                    this.NejakaFunkce(15, true, "Hello world!");
                };
    
                // Invoke() zaridi spusteni delegata v UI vlakne - ceka na jeho dokonceni
                this.Invoke(mujDelegatProUI);
                // BeginInvoke() zaridi spusteni delegata v UI vlakne - NECEKA na jeho spusteni ani dokonceni, toto vlakno pokracuje dal
                // this.BeginInvoke(mujDelegatProUI);
            }
        }
    
        void NejakaFunkce(int a, bool b, string c) {
            // .... neco to dela
        }
    }
    


    Je dobre si uvedomit zda chces pouzivat Invoke() ci BeginInvoke().
    Dobrej clanek o multithreadingu v ramci winforms je na codeprojectu: http://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke

    Pripadne se mi ozvi do posty s kodem, kouknu se ti na to.
    LOOCAS
    LOOCAS --- ---
    KEDRIGERN: Díky. Jinak já vim, že je to celkem jednoduchý, jen jsem to zatim nikdy nepsal. Jen opačnej případ - posílání dat přes TCP protokol. :)
    KEDRIGERN
    KEDRIGERN --- ---
    LOOCAS: Jde to nejméně udělat úplně stejně jako když sdílíš data mezi více thready - statické proměnné.

    Přímo event uděláš na konci procedury příjímající data. Vyzkoušej si minimal working example. Metoda listen (pokud si pamatuji, možná je to jiná z těch tří) čeká než jí něco přijde. Pak se teprve začne provádět další běh. V tom dalším běhu bude obslužná rutina a bude to obalené cyklem, abys stále naslouchal.

    Napsat v tom chat je asi na 10 řádek :).
    LOOCAS
    LOOCAS --- ---
    Tak budu muset otravovat ještě jednou. :D

    Jestli jsem to pochopil správně, tak si zinstancuju tu TcpClinet třídu, aby poslouchala na TCP protokolu, na nějakym portu, na localhostu, např.

    Ale obalim jí v, např., BackgroundWorker třídě, aby mi to běželo v separátním threadu.

    Nicméně, jakym způsobem spustim nějakej event, v případě, že ten TcpClient obdrží nějaký data?

    Chci v hostující aplikaci naslouchat na nějakym portu a spouštět příkazy, který přijdou z jiný aplikace externě (v rámci tý samý mašiny).
    LOOCAS
    LOOCAS --- ---
    Mnohokrát díky za nasměrování, pánové.

    Jdu to zkoušet. :)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    LOOCAS: Ty command-line prikazy muzes poustet klidne z IronPythonu.
    U TcPServeru to je jednoduchy - koukni na tridu TcpClient.
    Kliknutím sem můžete změnit nastavení reklam