Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Открыть новую тему     Написать ответ в эту тему

Yakon

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Проблема в том, что программа держит постоянно файл отрытым на запись.
Поэтому объём файла растёт, при открытии блокнотом я вижу появление новых строк,
а время изменения файла не меняется до остановки программы, пищущей логи. Соответственно FileSystemWatcher бесконечно ждет наступления события, а Dim FileStream As New FileStream("c:\logs.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite), запущенное без наступления события изменения файла, выводит в переменную обрывающийся в конце лог. Нельзя ли как-то извне заставить другую программу сбросить все изменения файла на диск. Так как новая запись вносится с переодичность 20-30секунд, но FileStream почему-то никогда не загружает целый лог.

Всего записей: 162 | Зарегистр. 11-01-2004 | Отправлено: 09:33 18-04-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Yakon
А зачем ты читаешь файл порциями по килобайту что бы все равно накапливать результат в txt? Читай файл сразу весь и по событию, как советует helgi.
И вообще. Вот такие операции со строками в цикле
Код:
txt = txt & System.Text.Encoding.ASCII.GetString(buffer)
не эффективны с точки зрения расхода памяти и быстродействия. Используй класс StringBuilder.

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 09:37 18-04-2008
Yakon

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
BaluBig
А можно дать кусок кода?
Я не программист и туго соображаю.
У меня кроме Dim FileStream As New FileStream("c:\logs.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) всё остально отказалось читать файл, выбрасывая сообщение, что файл уже используется другим процессом.
 
Добавлено:
helgi
Сорри.  
        directory = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
        Dim watcher As New System.IO.FileSystemWatcher("C:\logs", "1.log")
        Dim result As System.IO.WaitForChangedResult = watcher.WaitForChanged(System.IO.WatcherChangeTypes.Changed)
        Main2()
Работает при изменении размера.
Но при
                Dim FileStream As New FileStream("c:\logs\1.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
                Dim buffer(1024) As Byte
                Dim bytesRead As Integer
                Dim txt As String = ""
                While True
                    bytesRead = FileStream.Read(buffer, 0, buffer.Length)
                    If bytesRead = 0 Then
                        Exit While
                    End If
                    txt = txt & System.Text.Encoding.ASCII.GetString(buffer)
                End While
                FileStream.Close()
                System.IO.File.AppendAllText("c:\logs\2.log", txt)
Получаю в txt:
18/03/2008   9:39:40  Started 3DSMediaPlayer
18/03/2008   9:39:40  Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008   9:39:54  Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008   9:40:08  Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008   9:40:21  Stopping 3DSMediaPlayer (because of termination by user)
18/03/2008   9:40:37  Started 3DSMediaPlayer
18/03/2008   9:40:38  Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008   9:40:52  Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008   9:41:06  Stopping 3DSMediaPlayer (because of automated restart)
18/03/2008   9:41:06  Started 3DSMediaPlayer
18/03/2008   9:41:07  Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008   9:41:08  Stopping 3DSMediaPlayer (because of termination by user)
18/03/2008  11:22:09  Started 3DSMediaPlayer
18/03/2008  11:22:09  Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008  11:22:24  Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008  11:22:38  Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008  11:22:52  Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008  11:23:06  Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
ping 3DSMediaPlayer (because of termination by user)
18/03/2008   9:40:37  Started 3DSMediaPlayer
18/03/2008   9:40:38  Playing fi
ОТкуда берутся последние три строчки мне непонятно.
Как ещё можно прочитать файл открытый для записи?

Всего записей: 162 | Зарегистр. 11-01-2004 | Отправлено: 11:18 18-04-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Yakon

Цитата:
Я не программист и туго соображаю.
А может лучше пусть программисты этим занимаются (без обид)? Или аватарку смени
А пример кода - это можно.
Код:
 
Imports System.IO
Imports System.Text
 
Public Class MainForm
    Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Основные настройки FileSystemWatcher
        fsWatch.EnableRaisingEvents = True
        fsWatch.NotifyFilter = System.IO.NotifyFilters.LastWrite
        fsWatch.SynchronizingObject = Me
    End Sub
 
    Private Sub btAction_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAction.Click
        If edFile.Enabled Then
            edLog.Text = String.Empty
 
            ' Основные настройки FileSystemWatcher
            fsWatch.Path = Path.GetDirectoryName(edFile.Text)
            fsWatch.Filter = Path.GetFileName(edFile.Text)
 
            ' Запускаем слежение!
            fsWatch.EnableRaisingEvents = True
 
            edFile.Enabled = False
            btAction.Text = "Stop"
        Else
            fsWatch.EnableRaisingEvents = False
            edFile.Enabled = True
            btAction.Text = "Start"
        End If
    End Sub
 
    Private Sub fsWatch_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles fsWatch.Changed
        ' Файловый поток
        Dim fs As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
        ' Читатель текста из потока (что бы с буферами не возиться).
        ' Обрати внимание на указание кодировки!
        Dim rdr As New StreamReader(fs, Encoding.GetEncoding(1251))
        ' Построитель строк (можно и без него)
        Dim sb As New StringBuilder()
 
        While Not rdr.EndOfStream()
            ' Вот так делаем если в цикле нужна конкатенация строк - это экономит
            ' память и время сборщика мусора. Оператор & - фу, лучше String.Append().
            sb.AppendLine(rdr.ReadLine())
        End While
 
        ' Получили результат в окошко.
        edLog.Text = sb.ToString()
 
        ' А вот так можно и нужно было делать вместо StringBuilder и цикла While
        'edLog.Text = rdr.ReadToEnd()
 
        ' Закрываем поток
        rdr.Close()
    End Sub
End Class
 

Сам проект тут можно взять. VS2008.
Я не могу гарантировать, что будет работать с твоим логописателем, но если в фаре открыть редактором файл и писать туда, то после нажатия на сохранить весь текст замечательно появляется в окошке.

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 12:19 20-04-2008
Yakon

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
BaluBig
 

Цитата:
А может лучше пусть программисты этим занимаются (без обид)? Или аватарку смени  
А пример кода - это можно.
 

Ну а если нет программиста? А программа позарез нужна...
А чем моя аватара не нравится? Это всего лишь знак зодиака.
Спасибо за код, я в пятницу вечером похожий написал. Значит на правильном пути был...

Всего записей: 162 | Зарегистр. 11-01-2004 | Отправлено: 18:45 20-04-2008
MFPSoftware



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задумал писать тут программку, которая бы выводила html код в текстовое поле.
 
За текстовое поле взял textbox (мультилайн - тру).
 
Задача - добавлять поочередно строки, разделяя их символом перевода коретки.
Вот как добавлять туда я так и не понял. Можно только присвоить параметру text итоговое значение, которое выведется на экран, а как добавлять - не знаю.
 
Так вот, как добавить строку в конец контрола?
 
Или может я выбрал не тот компонент?

Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 23:56 21-04-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MFPSoftware
Я так понимаю, что нужно сначала собрать некий текст, потом его весь вывести в контрол. Если тупо и в лоб, никто не запрещает для каждой новой строки делать
Код:
theTextBox.Text += "\r\n" + someString;
. Но лучше делать через StringBuilder.AppendLine, см. мое предыдущее сообщение.

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 09:19 22-04-2008
MFPSoftware



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот блин... Такое элементарное решение, а сам чего-то не додумался. Все искал подобие метода Add... c# развращает =)
 
Спасибо

Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 11:43 22-04-2008
MFPSoftware



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите еще такую вещь, как получить информацию из DataGridView?
 
Явное преобразование типа (int)DataGridView1.rows[1].cells[2].value не работает по причине, что не конвертируется тип Object в тип int.
 
И можно ли как-то настроить поля так, что бы они содержали определенный тип значений, вроде как это сделано в офисных БД, вроде Acсess'а?

Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 21:52 22-04-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MFPSoftware

Цитата:
Явное преобразование типа (int)DataGridView1.rows[1].cells[2].value не работает по причине, что не конвертируется тип Object в тип int.
Не работать это может только по одной причине: в ячейке не int. Даже если там, например, float, похожий на int, такое преобразование не будет работать потому, что происходит разбоксирование (unboxing) значения. Что бы не наступать на эти грабли можно воспользоваться классом Convert, а именно Convert.ToInt32(object). Предварительно проверив значение на равенство DBNull.Value.
 

Цитата:
И можно ли как-то настроить поля так, что бы они содержали определенный тип значений, вроде как это сделано в офисных БД, вроде Acсess'а?
В гриде - нет. Это можно сделать в DataTable, если грид с ним связан. И, кстати, можно к ячейкам обращаться так: DataGridView1[columnIndex, rowIndex].Value.
 

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 14:12 23-04-2008 | Исправлено: BaluBig, 14:15 23-04-2008
MFPSoftware



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Не работать это может только по одной причине: в ячейке не int. Даже если там, например, float, похожий на int

В датагриде в значениях всегда базовый тип, даже в чекбоксах.
Вот именно этот базовый тип я и хотел преобразовать к целочисленному, методом (int), или как там эта штука называется.
 
Классом конверт получилось, спасибо.
Про индексацию таблицы тоже спасибо... так намного удобнее.

Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 19:34 23-04-2008
MFPSoftware



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Снова вопросики... Подскажите, как взаимодействовать с новыми создаваемыми формами?
 
Т.е. я хочу сделать диалоговое окошко, в текст бокс которого надо ввести информацию.
Для этого я добавляю в солюшен новый объект типа формы, добавляю в него текст бокс и кнопку, по которой он будет закрываться и передавать значение в программу.
 
Вот как все это реализовать, я так и не понял.
Форма называется - Form2.
Я так понял, что нужно создать новый экземпляр этого класса, а затем его показать, так?
 
Form2 newForm = new Form2();
newForm.Show();
 
Форма то конечно запустилась, но вот как гонять данные туда-сюда я так и не понял.

Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 21:34 23-04-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MFPSoftware
Так. Похоже пора в магазин за книжкой. Я бы вот это рекомендовал (большой и толстый талмуд обо всём):
Нейгел, Ивьен, Глинн, Скиннер, Уотсон "C# 2005 и платформа .NET 3.0 для профессионалов".
В природе есть "C# 2008 ...", но на русский язык afaik не перевели еще. Есть в электронном виде (37Мб djvu).
 
Что касается передачи данных. В общем случае - создается у формы открытый метод, а лучше проперть, и с помощью этого передаются данные. Кроме Show есть еще ShowDialog для показа формы в модальном виде (форма должна выставлять сама себе значение проперти DialogResult). Если форма показана через Show и закрыта пользователем - для неё уже отработал метод Dispose и к повторному показу она уже не пригодна. В случае ShowDialog повторный показ возможен.
 
Добавлено:

Цитата:
В датагриде в значениях всегда базовый тип, даже в чекбоксах.
Да. Но это не мешает его приводить к тому, к чему надо. Но там есть нюанс.

Код:
 
float var1 = 3;
object var2 = var1;
int var3 = (int)var2; // Будет ошибка.
int var3 = (int)(float)var2; // А так будет работать.  
 

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 09:31 24-04-2008
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BaluBig

Цитата:
В природе есть "C# 2008 ...", но на русский язык afaik не перевели еще. Есть в электронном виде (37Мб djvu).  

А можно ссылочку в приват (а то здесь вроде нельзя)?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 18:36 24-04-2008
DannyX

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Снова вопросики... Подскажите, как взаимодействовать с новыми создаваемыми формами?  
 
Т.е. я хочу сделать диалоговое окошко, в текст бокс которого надо ввести информацию.  
Для этого я добавляю в солюшен новый объект типа формы, добавляю в него текст бокс и кнопку, по которой он будет закрываться и передавать значение в программу.  
 
Вот как все это реализовать, я так и не понял.  
Форма называется - Form2.  
Я так понял, что нужно создать новый экземпляр этого класса, а затем его показать, так?  
 
Form2 newForm = new Form2();  
newForm.Show();  
 
Форма то конечно запустилась, но вот как гонять данные туда-сюда я так и не понял.

таки, кури get {} ; set {};

Всего записей: 1 | Зарегистр. 28-04-2008 | Отправлено: 21:17 28-04-2008
MFPSoftware



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С этим вопрсом я уже разобрался. Спасибо.
 
Подскажите вот что:
сделал прмитивное подобие броузера, у которого в табах открываются компоненты WebBrowser. Все бы ничего, да вот только новые страницы он открывает в ИЕ.
Я перехватываю урл страницы в переменной "e" в событии Navigating, вот только никак не пойму, как определить, должна ли эта ссылка открываться в новой странице или же нет?

Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 20:20 30-04-2008
grin

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ! Вопрос про MDI-приложения. А как отслеживать в родительском окне какое из дочерних окон закрылось, чтобы ресурсы этого окна освободить функцией Dispose() ? Насколько я знаю, при закрытии дочернего окна его ресурсы не освобождаются, а окно просто хидится.

Всего записей: 122 | Зарегистр. 05-09-2001 | Отправлено: 14:09 07-05-2008 | Исправлено: grin, 14:14 07-05-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
grin
Неправда. Форма просто скрывается при закрытии если она была показана как модальная через ShowDialog(). Во всех остальных случаях при закрытии вызывается Dispose(). В этом легко убедиться проверив свойство Form.IsDisposed после закрытия формы.

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 22:59 08-05-2008
grin

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BaluBig
Да, ты прав. Тогда такой вопрос. Допускает ли сборщик мусора утечку памяти. Дело в том, что я в дочерних формах создаю объекты типа Bitmap и Graphics, работаю с ними, даже когда они мне не нужны вызываю принудительно Dispose() для них, но при закрытии дочерней формы ProcessExplorer показывает, что память не полностью освобождается, а при открытии новой формы вырастает больше чем при открытии первой формы (плюс остаток), хотя при открытии формы я принудительно запускаю GC.Collect()

Всего записей: 122 | Зарегистр. 05-09-2001 | Отправлено: 13:18 12-05-2008
BaluBig



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
grin

Цитата:
Допускает ли сборщик мусора утечку памяти.

Сборщик мусора не замечен в организации утечек памяти. С неуправляемыми ресурсами, в том числе с памятью, может быть не все так замечательно. Попробуй поиграться в таком духе (пример из MSDN):

Код:
 
class MyGCCollectClass
    {
        private const long maxGarbage = 1000;
 
        static void Main()
        {
            MyGCCollectClass myGCCol = new MyGCCollectClass();
 
            // Determine the maximum number of generations the system
        // garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);
 
            myGCCol.MakeSomeGarbage();
 
            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
 
            // Determine the best available approximation of the number  
        // of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
 
            // Perform a collection of generation 0 only.
            GC.Collect(0);
            GC.WaitForPendingFinalizers(); // Тоже не лишнее - BaluBig
 
            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
 
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
 
            // Perform a collection of all generations up to and including 2.
            GC.Collect(2);
            GC.WaitForPendingFinalizers(); // Тоже не лишнее - BaluBig
 
            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            Console.Read();
        }
 
        void MakeSomeGarbage()
        {
            Version vt;
 
            for(int i = 0; i < maxGarbage; i++)
            {
                // Create objects and release them to fill up memory
        // with unused objects.
                vt = new Version();
            }
        }
    }
 

Всего записей: 404 | Зарегистр. 06-02-2004 | Отправлено: 12:40 13-05-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru