отображение процесса передачи данных

 
0
 
.NET
ava
0000 | 08.08.2007, 12:25
посмотрел, поискал - че-то не наблюдаю (может плохо искал)..
хотелось бы понять как нормально сделать процесс отображения передачи данных через сокеты (с помощью socket.beginsend)

ситуция какая... в головном потоке создается поток на передачу данных..выполняет подключения к инету, какие-то внутренние действа, коннектится к серверу через сокеты и начинает передачу в отдельном потоке...

потокобезопасную связь с контролами я сделал - передается нормально..но я просто не понимаю как взять процесс передачи...
передаем буфер (byte[]) с помощью FileStream (который читается FileStream.Read..) пробовал отдельным потоком FileStream.BeginRead - все равно ниче путного - не могу поймать процесс этот - тока конечный результат скока байт передано....как в процессе сделать?

сенкс
Comments (13)
ava
SpaceSpace | 08.08.2007, 13:43 #
во время чтения н-ного колва байт кидаеш событие.
а в приемнике ловиш событие.
если знаеш размер целиком - то делишь - и в прогресс бар
ava
0000 | 08.08.2007, 13:51 #
так вот я и не понимаю как взять сие количество байт, которое я уже прочитал на данном этапе...через все эти события у меня и работает связь с контролами..я количество байт не могу узнать - не общее..а скока передано на данный момент
ava
SpaceSpace | 09.08.2007, 07:57 #
это ты создаеш отдельный поток?
если да, то воля твоя не целиком все считать, а через промежутки.
вот в промежутках и кидаеш событие
ava
0000 | 09.08.2007, 08:37 #
я создаю поток для передачи данных через пул потоков...то есть один метод мой выполняется в новом потоке...
там работа с сетью через сокеты и использую beginsend...вот этим потоком (который так создается) как управлять??как получать промежуточные результаты?
ava
SpaceSpace | 09.08.2007, 08:48 #
давай твой код. поглядим, что там такого непонятного
ava
0000 | 10.08.2007, 10:45 #
короче...
вот отсюда вызываем -

this.Client.CurrentOrder.Send();


в методе Send пользуемся пулом потоков
ThreadPool.QueueUserWorkItem(new WaitCallback(this.doSend), this.pc);


там потом некоторые внутренние операции...в методе this.doSend создается мой NetClient, который коннектится к инету, преобразует фалик необходимым мне образом


NetClient ftp = new NetClient();
ftp.OnPerformed += new ProgressPerformEventHandler(ftp_OnPerformed);
ftp.Upload(this.pc);

this.pc - это просто некоторая структурка, через которую можно передавать сообщения в моих этих событиях (в том числе и этом ftp.OnPerformed)


затем идем в метод ftp.Upload...
там создаем соединение с интернетом, если оно еще не установлено, преобразуем файл и создаем

if (hConnection != IntPtr.Zero)
{
this.ftp.OnPerform += new ProgressPerformEventHandler(ftp_OnPerform);
this.Convert(fileName, outFileName);
try
{
pc.Command = outFileName;
this.ftp.Upload(pc);
}
catch (Exception e)
{
new Log().WriteConnectionLog("NetClient.Upload(string) failed = " + e.Message);
}
finally
{
this.ftp.ReleaseConnect();
this.ftp.Close();
ConnectionManager.ConnMgr.ReleaseConnection(hConnection, this.timeout);
File.Delete(outFileName);
this.ftp.OnPerform -= new ProgressPerformEventHandler(ftp_OnPerform);
}
}


и вот пришли к реализации простого ftp-клиента...
метод Upload
..отправляем запрос...получаем ответ..все дела..


inp = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None, this.bufSize, true);
...
while ((bytes = inp.Read(this.SendBuff, 0, this.SendBuff.Length)) > 0)
{
try
{
pc.Command = this.DataSocket;
IAsyncResult ar = this.DataSocket.BeginSend(this.SendBuff, 0, bytes, SocketFlags.None, new AsyncCallback(this.SendingCallBack), pc);
while (!ar.IsCompleted)
{
pc.Value = 100; //ВОТ КАК ТУТ ПОЛУЧАТЬ ПРОЦЕСС ВЫПОЛНЕНИЯ!!!
if (OnPerform != null)
OnPerform(this, pc);
}
}
catch (Exception ex)
{
new Log().WriteConnectionLog(ex.Message);
pc.Rezult = false;
}
}

ava
SpaceSpace | 13.08.2007, 07:39 #
у тебя есть длина сегмента чтения?
есть.

а есть общая длина файла?
тоже есть, ты ведь его читаешь.
Следовательно


internal class ProgressEventArgs : EventArgs
{
private int currentElement;

public int CurrentElement
{
get { return currentElement; }
set { currentElement = value; }
}

private int allElements;

public int AllElements
{
get { return allElements; }
set { allElements = value; }
}

public ProgresstEventArgs(int currentElement, int allElements)
{
this.allElements = allElements;
this.currentElement = currentElement;
}
}


internal delegate void UpdateStatusDelegate(AppointmentEventArgs e);

// Define an Event based on the above Delegate
internal event UpdateStatusDelegate ProgressReported;
// call the Event
internal void OnProgressReported(AppointmentEventArgs e)
{
if (ProgressReported != null)
{
ProgressReported(e);
}
}


что тебе мешает в аргумен засовывать текущие номер блока и общее их количесиво(можно и без него обойтись)?

и кидать это событие?

ProgressEventArgs e = new ProgressEventArgs(currItem, allIUtems);
OnProgressReported(e);

а потом его ловить и в прогресс бар???
что мешает?
ava
0000 | 13.08.2007, 10:29 #
я вообще не про сам процесс этого дела...сам процесс я сделал...
общийй объем файла есть...
а длину сегмента чтения как узнать?
ava
SpaceSpace | 13.08.2007, 12:11 #
ты же в цикле считаеш в буфер - вот тебе и сегмент.
каждый вход в цикл.
чем больше шагов(чем меньше буфер) тем плавнее отражаются изменения.
или я что-то не то говорю?
ava
0000 | 13.08.2007, 12:47 #
у меня хрень в том, что цикл выполняется только один раз...и в первом же его выполнении значение bytes равно объему файла...
вот поэтому-то я никак и не пойму как выцепить значение это
ava
SpaceSpace | 13.08.2007, 13:19 #
мдя...
ну а размер буфера можно уменьшить?
ava
0000 | 13.08.2007, 13:49 #
а как это может помочь??...буффером-то я еще как-то смогу управлять..или ты предлагаешь прям по байту из буфера брать...
ava
SpaceSpace | 14.08.2007, 10:12 #
мдя..
RTFM по FileStream, BinaryReader.
все данные у тебя есть, осталось только сделать.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit