Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Обмен данными между приложениями Добавлено: 11.11.08 17:56  

Автор вопроса:  Legon
Здравствуйте. У меня вопрос:
В контекстное меню проводника Windows я встроил меню для вызова моей программы с передачей ей полного пути файла или папки для последующей обработки (копирования/перемещения). НО!, при выборе нескольких файлов, на каждый из них создается отдельный инстанс моей программы, что не есть хорошо, так как при множестве файлов будет жуткая нагрузка на винчестер и всю систему.
Хочеться реализовать программу по типу Winamp'a: Каждый интсанс отлавливает предидущий и если такой присутствует - передает ему параметры своей командной строки и закрывается. А главный (первый) инстанс создает список команд-файлов и обрабатывает их по очереди, желательно в отдельном потоке. Желательно, чтобы второй поток информировал главный поток о статусе операции.
Итог:
1. Как реализовать обмен данными?
2. (по-возможности) Как эффективно "добавлять" задания для выполнения? (ставить файлы в очередь на обработку в другой поток)
3. (по возможности) С помощью каких "технологий" создать поток создать поток (BackgroundWorker, Thread, ThreadSpool и т.д.), который бы информировал главный поток и изменял свойства видимых котнтролов?

Заранее спасибо!

Ответить

  Ответы Всего ответов: 25  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 11.11.08 18:04
1. Мутексы, семафоры, окна (сообщения)
2. Пул потоков.
3. Хз, я не дотнетчик. Я бы юзал потоки.

Ответить

Номер ответа: 2
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #2 Добавлено: 11.11.08 18:24
1. Мутексы, семафоры, окна (сообщения)

Извини, но мне это ничего не сказало.
2. Пул потоков.

Не подходит, так как мне нужно, чтобы поток был один (помимо основного). Главный поток, получая данные из другого приложения, должен обновлять список файлов в дочернем потоке, не прерывая его. То биш, дописывая пути новых файлов в конец "списка".

Ответить

Номер ответа: 3
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #3 Добавлено: 11.11.08 18:41
В принципе, два последних вопроса можно снять. Вся информация храниться в главном потоке, который на каждый файл будет запускать поток по очереди: поток закончил выполнение - запускаем следующий и т.д.
Осталось только решить, как передавать данные между приложениями.

Ответить

Номер ответа: 4
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #4 Добавлено: 11.11.08 20:28
http://www.codeproject.com/KB/books/WinForms20Programng.aspx

Ответить

Номер ответа: 5
Автор ответа:
 lanbob



Вопросов: 0
Ответов: 1
 Профиль | | #5 Добавлено: 11.11.08 21:41
не пробовал рассмотреть вариант с постановкой заданий в очередь.

Ответить

Номер ответа: 6
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #6 Добавлено: 11.11.08 22:17
http://www.codeproject.com/KB/books/WinForms20Programng.aspx
Спасибо за ссылку, только там на C, а я в нем мягко говоря "не очень". Но буду пытаться разобраться.
не пробовал рассмотреть вариант с постановкой заданий в очередь.
А как это? Если можно на примере.

Ответить

Номер ответа: 7
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #7
Добавлено: 12.11.08 00:37
Пишешь в массив имена файлов, при завершении обработки одного файла - пихаешь следующий. Что может быть проще?

Ответить

Номер ответа: 8
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #8 Добавлено: 12.11.08 01:05
Пишешь в массив имена файлов, при завершении обработки одного файла - пихаешь следующий. Что может быть проще?
Да с этим то понятно. Правда здесь все несколько сложнее, так как массив будет постоянно изменяться: при выполнении операций строки будут добавляться и в этот же момент при передачи новых - пополняться. Но и это, я думаю, не проблема.

А вот КАК получить эти имена файлов с другого приложения???

Ответить

Номер ответа: 9
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #9 Добавлено: 12.11.08 01:07
...при выполнении операций строки будут добавляться и в этот же момент...
опечатка: при выполнении строки будут УДАЛЯТЬСЯ, а при получении новых - добавляться. Но это не существенно.

Ответить

Номер ответа: 10
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #10
Добавлено: 12.11.08 01:26
кури MSDN. ищи synchronization overview

Ответить

Номер ответа: 11
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #11
Добавлено: 12.11.08 01:26
Я бы приер тебе накатал, но на дотнете не пишу

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 13.11.08 14:49
Вот пример нацарапал.
Если есть вопросы - готов ответить.

  1.     Class Processor
  2.  
  3.         Private _Queue As New Queue(Of String)
  4.         Private _Running As Boolean = False
  5.         Private _Lock As New Object
  6.  
  7.         Public Sub Add(ByVal file As String)
  8.             SyncLock _Queue
  9.                 _Queue.Enqueue(file)
  10.                 If Not _Running Then StartProcessing()
  11.             End SyncLock
  12.         End Sub
  13.  
  14.         Private Sub StartProcessing()
  15.             Dim T As New System.Threading.Thread(AddressOf Processing)
  16.             T.IsBackground = True
  17.             T.Priority = Threading.ThreadPriority.Lowest
  18.             T.Start()
  19.         End Sub
  20.  
  21.         Private Sub Processing()
  22.             _Running = True
  23.             Do
  24.                 Dim CurrentFile As String
  25.                 SyncLock _Queue
  26.                     If _Queue.Count = 0 Then
  27.                         _Running = False
  28.                         Return
  29.                     End If
  30.                     CurrentFile = _Queue.Dequeue
  31.                 End SyncLock
  32.                 ProcessFile(CurrentFile)
  33.             Loop
  34.         End Sub
  35.  
  36.         Private Sub ProcessFile(ByVal file As String)
  37.             Console.WriteLine("start {0}", file)
  38.             System.Threading.Thread.Sleep(2000)
  39.             Console.WriteLine("end {0}", file)
  40.         End Sub
  41.  
  42.     End Class

Ответить

Номер ответа: 13
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #13 Добавлено: 13.11.08 14:49
PS Eros - Привет!

Ответить

Номер ответа: 14
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #14 Добавлено: 13.11.08 22:32
Извините за долгую молчанку. Был на работе.
Steel Brand
Спасибо за листинг! Попробовал, ничего не заработало (допускаю, что не до конца все дооформил), но возникло еще больше вопросов чем было. Может по возможности стукнешь в АСЮ, если не затруднит? ICQ: 463103311

Ответить

Номер ответа: 15
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #15 Добавлено: 13.11.08 23:04
Вот пример использования класса.
Метод ProcessFile - заглушка, в моем случае она просто делает вывод в консоль и небольшую задержку, имитирующую долгий процес. В этом месте вам нужно вставить код обработки файла.

Впрочем если у вас есть еще вопросы, вы можете их здесь задать или же написать мне в ICQ.

  1. Module Module1
  2.  
  3.     Class Processor
  4.  
  5.         Private _Queue As New Queue(Of String)
  6.         Private _Running As Boolean = False
  7.         Private _Lock As New Object
  8.  
  9.         Public Sub Add(ByVal file As String)
  10.             SyncLock _Queue
  11.                 _Queue.Enqueue(file)
  12.                 If Not _Running Then StartProcessing()
  13.             End SyncLock
  14.         End Sub
  15.  
  16.         Private Sub StartProcessing()
  17.             Dim T As New System.Threading.Thread(AddressOf Processing)
  18.             T.IsBackground = True
  19.             T.Priority = Threading.ThreadPriority.Lowest
  20.             T.Start()
  21.         End Sub
  22.  
  23.         Private Sub Processing()
  24.             _Running = True
  25.             Do
  26.                 Dim CurrentFile As String
  27.                 SyncLock _Queue
  28.                     If _Queue.Count = 0 Then
  29.                         _Running = False
  30.                         Return
  31.                     End If
  32.                     CurrentFile = _Queue.Dequeue
  33.                 End SyncLock
  34.                 ProcessFile(CurrentFile)
  35.             Loop
  36.         End Sub
  37.  
  38.         Private Sub ProcessFile(ByVal file As String)
  39.             Console.WriteLine("start {0}", file)
  40.             System.Threading.Thread.Sleep(2000)
  41.             Console.WriteLine("end {0}", file)
  42.         End Sub
  43.  
  44.     End Class
  45.  
  46.  
  47.     Sub Main()
  48.  
  49.         Dim Proc As New Processor
  50.  
  51.         Do
  52.             Proc.Add(Console.ReadLine)
  53.         Loop
  54.     End Sub
  55. End Module

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам