abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 00:11 | Nová verze

    Open source modální textový editor Helix, inspirovaný editory Vim, Neovim či Kakoune, byl vydán ve verzi 25.07. Přehled novinek se záznamy terminálových sezení v asciinema v oznámení na webu. Detailně v CHANGELOGu na GitHubu.

    Ladislav Hagara | Komentářů: 0
    včera 20:44 | IT novinky

    Americký výrobce čipů Nvidia získal od vlády prezidenta Donalda Trumpa souhlas s prodejem svých pokročilých počítačových čipů používaných k vývoji umělé inteligence (AI) H20 do Číny. Prodej těchto čipů speciálně upravených pro čínský trh by tak mohl být brzy obnoven, uvedla firma na svém blogu. Americká vláda zakázala prodej v dubnu, v době eskalace obchodního sporu mezi oběma zeměmi. Tehdy to zdůvodnila obavami, že by čipy mohla využívat čínská armáda.

    Ladislav Hagara | Komentářů: 0
    včera 17:22 | Nová verze

    3D software Blender byl vydán ve verzi 4.5 s prodlouženou podporou. Podrobnosti v poznámkách k vydání. Videopředstavení na YouTube.

    Ladislav Hagara | Komentářů: 0
    14.7. 22:22 | Komunita

    Open source webový aplikační framework Django slaví 20. narozeniny.

    Ladislav Hagara | Komentářů: 0
    14.7. 16:11 | Komunita

    V Brestu dnes začala konference vývojářů a uživatelů linuxové distribuce Debian DebConf25. Na programu je řada zajímavých přednášek. Sledovat je lze online.

    Ladislav Hagara | Komentářů: 0
    14.7. 11:33 | IT novinky

    Před 30 lety, tj. 14. července 1995, se začala používat přípona .mp3 pro soubory s hudbou komprimovanou pomocí MPEG-2 Audio Layer 3.

    Ladislav Hagara | Komentářů: 26
    14.7. 10:55 | IT novinky

    Výroba 8bitových domácích počítačů Commodore 64 byla ukončena v dubnu 1994. Po více než 30 letech byl představen nový oficiální Commodore 64 Ultimate (YouTube). S deskou postavenou na FPGA. Ve 3 edicích v ceně od 299 dolarů a plánovaným dodáním v říjnu a listopadu letošního roku.

    Ladislav Hagara | Komentářů: 20
    13.7. 17:55 | Zajímavý projekt

    Společnost Hugging Face ve spolupráci se společností Pollen Robotics představila open source robota Reachy Mini (YouTube). Předobjednat lze lite verzi za 299 dolarů a wireless verzi s Raspberry Pi 5 za 449 dolarů.

    Ladislav Hagara | Komentářů: 17
    11.7. 16:44 | Komunita

    Dnes v 17:30 bude oficiálně vydána open source počítačová hra DOGWALK vytvořena v 3D softwaru Blender a herním enginu Godot. Release party proběhne na YouTube od 17:00.

    Ladislav Hagara | Komentářů: 3
    11.7. 14:55 | Humor

    McDonald's se spojil se společností Paradox a pracovníky nabírá také pomocí AI řešení s virtuální asistentkou Olivii běžící na webu McHire. Ian Carroll a Sam Curry se na toto AI řešení blíže podívali a opravdu je překvapilo, že se mohli přihlásit pomocí jména 123456 a hesla 123456 a získat přístup k údajům o 64 milionech uchazečů o práci.

    Ladislav Hagara | Komentářů: 16
    Jaký je váš oblíbený skriptovací jazyk?
     (59%)
     (26%)
     (7%)
     (3%)
     (1%)
     (1%)
     (4%)
    Celkem 398 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    Rozcestník

    Dotaz: select a jak ho vzbudit

    3.5.2009 00:36 Deleted [8409] | skóre: 14 | blog: darkblog
    select a jak ho vzbudit
    Přečteno: 218×
    Chtěl bych se zeptat, jakým způsobem se dá vzbudit select(), který čeká na X11.

    Mám následující kód:
    void EventPumpX11::waitForWork()
    {
      UISystemX11* uiSystem = UI_SYSTEM();
    
      int fd = uiSystem->_fd;
      int fdSize = fd + 1;
      fd_set fdSet;
    
      struct timeval tval;
      FD_ZERO(&fdSet);
      FD_SET(fd, &fdSet);
    
      TimeDelta delay = _delayedWorkTime - Time::now();
      if (delay > TimeDelta())
      {
        // Go to sleep. X11 will wake us to process X events. We also set interval
        // to wake up if there are planned tasks to specific time (Timers).
        int64_t udelay = delay.inMicroseconds();
        tval.tv_sec = (int)(udelay / 1000000);
        tval.tv_usec = (int)(udelay % 1000000);
        if (tval.tv_usec <= 100) tval.tv_usec = 100;
    
        int ret = ::select(fdSize, &fdSet, NULL, NULL, &tval);
        // TODO: Check for select result
      }
      else
      {
        // It looks like delayedWorkTime indicates a time in the past, so we
        // need to call doDelayedWork now.
        _delayedWorkTime = Time();
      }
    }
    
    kde fd je deskriptor, který jsem obdržel pomocí ConnectionNumber(Display*) (Xlib). O co mi jde, potřeboval bych probudit event loop, když chci z jiného vlákna poslat událost do toho hlavního, které čeká buď na událost z X11 nebo na vypršení časového limitu potřebného pro jiné úkoly (delay).

    Myslím, že správná cesta bude vytvořit vlastní file descriptor, na který pošlu 1 byte v případě, že budu chtít probudit event loop, ale nějak nevím jak přesně na to (toto jsem ještě nikdy nedělal). Použít fd_set a do masky dát vlastní fd?

    Stačí mi nakopnutí správným směrem ;)

    Odpovědi

    3.5.2009 03:41 joe
    Rozbalit Rozbalit vše Re: select a jak ho vzbudit
    Přesně tak, jen přidáš ten další deskriptor (nejlépe asi z pipe()) pomocí FD_SET(fd2, fdSet) a fdSize upravíš na max(fd, fd2) + 1 a po tom selectu otestuješ, na kterých deskriptorech jsou data pomocí FD_ISSET (i ten druhý deskriptor musíš vyprazdňovat). Samozřejmě se to dá přerušit třeba signálem, ale musí člověk přesně vědět, co všechno to může udělat. Přidání dalšího deskriptoru je nejčistší.
    3.5.2009 12:29 Deleted [8409] | skóre: 14 | blog: darkblog
    Rozbalit Rozbalit vše Re: select a jak ho vzbudit
    díky, dopracoval jsem se k něčemu takovému:
    void EventPumpX11::waitForWork()
    {
      UISystemX11* uiSystem = UI_SYSTEM();
    
      int fd = uiSystem->_fd;
      int fdSize = fog_max(fd, uiSystem->_wakeUpPipe[0]) + 1;
      fd_set fdSet;
    
      struct timeval tval;
      struct timeval* ptval = NULL;
      FD_ZERO(&fdSet);
      FD_SET(fd, &fdSet);
      FD_SET(uiSystem->_wakeUpPipe[0], &fdSet);
    
      if (_delayedWorkTime.isNull())
      {
        // There are no scheduled tasks, so ptval is NULL and this tells to select()
        // that it should wait infitine time.
      }
      else
      {
        TimeDelta delay = _delayedWorkTime - Time::now();
    
        if (delay > TimeDelta())
        {
          // Go to sleep. X11 will wake us to process X events and we also set
          // interval to wake up to run planned tasks (usually Timers).
          int64_t udelay = delay.inMicroseconds();
          tval.tv_sec = (int)(udelay / 1000000);
          tval.tv_usec = (int)(udelay % 1000000);
          if (tval.tv_usec <= 100) tval.tv_usec = 100;
          ptval = &tval;
        }
        else
        {
          // It looks like delayedWorkTime indicates a time in the past, so we
          // need to call doDelayedWork now.
          _delayedWorkTime = Time();
          return;
        }
      }
    
      int ret = ::select(fdSize, &fdSet, NULL, NULL, ptval);
    
      if (ret < 0)
      {
        fog_debug("Fog::EventPumpX11::waitForWork() - select() failed (errno=%d).", errno);
      }
    
      if (ret > 0)
      {
        if (FD_ISSET(uiSystem->_wakeUpPipe[0], &fdSet))
        {
          // Dummy c, the actual value is out of our interest.
          uint8_t c;
          read(uiSystem->_wakeUpPipe[0], &c, 1);
          _wakeUpSent.cmpXchg(1, 0);
        }
      }
    }
    
    a Kód pro probuzen9 z jiiného vlákna vypadá takto:
    void EventPumpX11::sendWakeUp()
    {
      if (_wakeUpSent.cmpXchg(0, 1))
      {
        UISystemX11* uiSystem = UI_SYSTEM();
        uint8_t c = 'W';
    
        write(uiSystem->_wakeUpPipe[1], &c, 1);
      }
    }
    
    požil jsem atomické operace k tomu, abych do pipe neposílal příliš moc, teď tam je normálně jen ten 1 BYTE, který probudí select. Funguje to, ale samořejmě to může obsahovat chyby (zase tak moc jsem to neotestoval)...

    Ke kompletnosti ještě vytvoření pipe:
      // Create wakeup pipe.
      if (pipe(_wakeUpPipe) < 0)
      {
        fog_debug("Fog::UISystemX11::Can't create wakeup pipe");
        goto fail;
      }
    
    K zápisu používám _wakeUpPipe[1] a ke čtení _wakeUpPipe[0], doufám, že jsem to pochopil správně...:)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.