Symbiatch - maailma on rikki

Asynkroninen lähetys ja vastaanotto

12.03.2007 10.36 - mobiili ohjelmointi 

Tuli tuossa tarve lähettää ja vastaanottaa dataa asynkronisesti (siis protokolla asynkroninen, itse komentojen ei tarvitsisi olla). Tuli sitten huomattua myös miten ihanaa se on Symbianilla kun kaiken mahdollisen pitää olla asynkkia.

Jos haluaa vuorotellen kirjoitella ja lukea, ongelmia ei tule juurikaan. Tietysti "aktiiviset objektit" ovat ärsyttäviä käyttää muutenkin, mutta mitään lisähankaluutta tästä ei tule. Mutta sitten jos onkin tilanne jossa kumpikin pää voi lähetellä tietoa miten haluaa, joudutaan tekemään paljon monimutkaisemmin.

Koska luku ja kirjoitus ovat molemmat asynkronisia, tarvitsee joka kutsun jälkeen asettaa olio aktiiviseksi ja odottaa viestiä valmistumisesta. Täten kun normaalisti asetetaan soketti lukemaan dataa ja kertomaan kun jotain tulee, on olio koko ajan aktiivinen. Jos samalla yrittää kirjoittaa, se onnistuu, mutta tästä tulee ihan sama eventti ja on aika hankalaa (ellei mahdotonta) erottaa oliko nyt kyseessä luku- vai kirjoituseventti.

Ratkaisu? Tehdään kaksi oliota, joista toinen lukee ja toinen kirjoittaa sokettiin! Oi kun nättiä. Mahdollisesti myös onnistuisi jonkinlainen select-tyyppinen ratkaisu tai monimutkaisesti erotella onko kyseessä luku- vai kirjoituseventti (en heti keksinyt miten tällainen onnistuisi). Mutta kahden olion käyttäminen tuntuu yksinkertaisemmalta, vaikkakin turhan monimutkaiselta.

Lienee sanomattakin selvää että tuli ikävä .NETin BeginReceiveä ja synkronisia kirjoitus- ja lukuoperaatioita :P

Kommentoi

Kommentit

(anon, 16.03.2007 00.05)

"Lienee sanomattakin selvää että tuli ikävä .NETin BeginReceiveä ja synkronisia kirjoitus- ja lukuoperaatioita :P"

Joo, minä olen aikonani tehnyt asynkroonisella menetelmällä softaa .NETillä. Nyt en ihan tasan tarkkaan muista kuinka esim. verkon yli operaatiot menivät ko. menetelmällä, niin kuitenkin muistan sen, että yksi puute tuossa async-jutussa on. Nääs, että kun käynnistän operaation ja kun olen odottanut tietyn ajan, ja kun vastapää ei vastaa, niin kuinka poistan tuon operaation, niin että muisti vapautuu?.
Siis, tämä on erittäin tärkeä piirre, että kun jonkun aikaa on odotettu verkko-operaation valmistumista, ja nyt sitten halutaankin cancelloida tuo operaatio, niin kuinka hallitsen mustin? Garbage Collectori ei tässä
tappuksessa toimi - käsittääkseni.

Teollisuusautomaatiossa näillä viipeillä pelataan niin
paljon, että esim. .NET putosi pois tämän ominaisuuden
johdosta, eli kun ei ole mahdollista lopettaa async-toimintoa silloin kun minä sen haluan ja että
samalla roskien keruu toimii. Eli ennen kuin End*-vaihe toteutuu, haluan poistaa operaation muistista.

SIMATICISSA tämä toimii, mutta kuinka on näissä
pc-juttujen käyttöjärjestelmien yhteydessä? Onko tietoa?


Symbiatch (16.03.2007 09.23)

Tuo on kyllä totta, ei olekaan tullut tarvetta katkaista latausta noin. Ainut tapa noilla vakiometodeilla katkaista pyyntö on sulkea soketti. Tästä tulee sitten poikkeus, näköjään jos kutsuu Shutdownia, saa nätisti EndReceiven ja sen jälkeen voi sulkea soketin ilman poikkeuksia.

Itse tehtynä tuo onnistuu helpommin, threadpooliin vaan ja sinne aikakatkaisu. Eli ihan mahdollista normaaleissa PC-ympäristöissä, jostain syystä ei .NETtiin moista rakenettu vakiona.

Jutut.fi  |  Omat jutut  |  Muiden jutut  |  Kategoriat  |  kirjaudu