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 16:33 | Zajímavý projekt

    Open-source trackball Ploopy Adept má novou verzi nazvanou A+. Stále jde o symetrický desktopový trackball s šasi z 3D tiskárny a firmwarem QMK. Novinkami jsou dvojice tlačítek, jimiž půjde také otáčet, a volitelná opěrka ruky. Funkcionalita firmwaru je rozšířena o gesta, vrstvy a možnost konfigurace za běhu. Schémata a kód jsou jako obvykle na GitHubu. A+ půjde předobjednat za 99 CAD (bez dopravy a cla/DPH).

    |🇵🇸 | Komentářů: 3
    dnes 14:33 | IT novinky

    Prusa Research představil nové modely svých 3D tiskáren: Prusa XL+, CORE One+ (Gen 2) a CORE One L+.

    Ladislav Hagara | Komentářů: 1
    dnes 13:33 | Nová verze

    Crown je multiplatformní open source herní engine. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT a GPLv3+. Byla vydána nová verze 0.64. Vyzkoušet lze online demo.

    Ladislav Hagara | Komentářů: 0
    dnes 03:44 | Nová verze

    NVIDIA na konci ledna vydala v beta verzi nativního linuxového klienta své cloudové herní služby GeForce NOW. Včera oznámila ukončení beta verze a oficiální podporu Linuxu.

    Ladislav Hagara | Komentářů: 0
    dnes 02:33 | Nová verze

    Byla vydána nová verze 3.5.0 nástroje pro inkrementální kopírování souborů rsync (Wikipedie). Přehled oprav a vylepšení v souboru NEWS. Řešeno je 33 zranitelností.

    Ladislav Hagara | Komentářů: 0
    dnes 02:22 | Nová verze

    Organizace Apache Software Foundation (ASF) vydala verzi 31 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.

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

    Firma IBM uvedla svůj první mikropočítač Personal Computer před 45 lety, v srpnu 1981. Základní konfigurace modelu 5150 za 1 565 tehdejších dolarů obsahovala desktop s Intel 8088 a 16KB RAM, Color Graphics Adapter a klávesnici. Právě klávesnice Model F/XT vybavené kapacitními spínači, vlivné a s převodníkem dodnes použitelné, připomíná sběratelský web Admiral Shark's Keyboards.

    |🇵🇸 | Komentářů: 0
    včera 14:22 | IT novinky

    Slovensko odhalilo ruské součástky ve dvou testovaných zařízeních na zjišťování přestupků v silničním provozu a označilo je za bezpečnostní riziko. S odvoláním na vyjádření slovenského Národního bezpečnostního úřadu (NBÚ) to včera oznámil ministr vnitra Matúš Šutaj Eštok. Zároveň ohlásil ukončení spolupráce svého úřadu s dodavatelem části uvedeného systému, slovenskou společností Soitron. Opozice, která na problematické kamery upozornila už dříve, vyzvala k odvolání ministra vnitra.

    Ladislav Hagara | Komentářů: 12
    včera 06:00 | IT novinky

    Dle plánu dnes ve 13:00 proběhne veřejný test eDokladů. Jeho cílem je ověřit připravenost aplikace a související infrastruktury na vysokou souběžnou zátěž před podzimními komunálními volbami.

    Ladislav Hagara | Komentářů: 25
    včera 04:11 | Nová verze

    Byla vydána nová verze 3.47 frameworku Flutter (Wikipedie) pro vývoj mobilních, webových i desktopových aplikací a nová verze 3.13 souvisejícího programovacího jazyka Dart (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (2%)
     (18%)
     (30%)
     (6%)
     (6%)
     (2%)
     (15%)
     (23%)
    Celkem 2387 hlasů
     Komentářů: 31, poslední včera 00:27
    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: 446×
    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.