-
1. Data: 2010-08-25 12:24:07
Temat: Streamin c#
Od: "ivr" <g...@p...onet.pl>
Witam,
Pytam gdyż nie mam koncepcji jak to dobrze rozwiązać.
Sytuacja:
MemoryStream do którego cyklicznie zapisuję dane.
Teraz mam watek, który powinien czytać dane po kawałku z tego streama.
byte[] rBuff = new byte[RetRes.MinimumStreamBufferSize];
_ttsStreamer.TtsStream.Read(rBuff, 0, RetRes.MinimumStreamBufferSize);
Tak to wygląda -> niestety czyta mi od Position a position to pozycja w
MemoryStream w której aktualnie zapisywana jest kolejna paczka.
Oczywiście mogę robić sobie manualnie seek'a ale szukam bardziej
eleganckiego rozwiązania.
Licze na pomoc.
Pozdrawiam
H.
-
2. Data: 2010-09-01 15:31:09
Temat: Re: Streamin c#
Od: Selvin <p...@g...com>
po co stream :) kolejka nie moze byc?
jak chcesz to mozesz to odziedziczyc po System.IO.Stream
public class MyBuffer
{
Queue<MemoryChunk> buffers = new Queue<MemoryChunk>();
object readlock = new object();
public uint AvailableDataLength { get; private set; }
public void Write(byte[] data, int offset, int count)
{
var mem = AllocateMemoryChunk(count);
Buffer.BlockCopy(data, offset, mem.Buffer, 0, count);
lock (readlock)
{
buffers.Enqueue(mem);
AvailableDataLength += count;
}
}
public int Read(byte[] buffer, int offset, int count)
{
int toread = 0;
lock (readlock)
{
if (buffers.Count != 0)
{
var buf = buffers.Peek();
toread = buf.Buffer.Length - buf.Offset;
int off = buf.Offset;
if (count >= toread)
buffers.Dequeue();
else
{
toread = count;
buf.Offset += toread;
}
Buffer.BlockCopy(buf.Buffer, off, buffer, offset,
toread);
AvailableDataLength -= toread;
}
return toread;
}
}
private MemoryChunk AllocateMemoryChunk(int newSize)
{
//zawsze mozna zrobic z tego pool zeby nie tworzyc nowych
MemoryChunk chunk = new MemoryChunk(newSize);
return chunk;
}
private class MemoryChunk
{
internal byte[] Buffer;
internal int Offset = 0;
internal MemoryChunk(uint bufferSize)
{
Buffer = new byte[bufferSize];
Offset = 0;
}
}
}
-
3. Data: 2010-09-01 15:34:24
Temat: Re: Streamin c#
Od: Selvin <p...@g...com>
> public uint AvailableDataLength { get; private set; }
ma byc:
public int AvailableDataLength { get; private set; }
heh kopiowalem z mojego programu gdzie musial byc uint :)
-
4. Data: 2010-09-05 08:18:14
Temat: Re: Streamin c#
Od: "ivr" <g...@p...onet.pl>
ma byc:
public int AvailableDataLength { get; private set; }
heh kopiowalem z mojego programu gdzie musial byc uint :)
Dzieks, kombinowalem czy czy nie da sie tego zrobic wbudowanymi klasami,
lecz ostatecznie
napisalem to recznie :)
Dzieki za przyklad!
Pozdro.
H.