Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как сделать программу фоновой ?


Автор: XPurple 19.5.2006, 07:41
Написал программу для запуска из командной строки. Интерфейс отсутствует. Но видно, что при запуске программа запускается не в фоновом режиме (форма курсора мышки меняется на песочные часы). Как сделать, чтобы программа запускалась в фоновом режиме ? 

Автор: boevik 19.5.2006, 07:46
При создании программы, добавить модуль и убрать форму.
В модуле создать процедуру main, это стартовая тожка программы.
Так же в project properties изменить старт программы с формы на main. 

Автор: XPurple 19.5.2006, 09:47
Цитата(boevik @  19.5.2006,  07:46 Найти цитируемый пост)
При создании программы, добавить модуль и убрать форму.

Сделал, как вы рекомендоввали, но при загрузке песочные часики остались плюс исчезло свойство иконки (Icon).
Может быть в самой программе как-то можно указать?  

Автор: Akina 19.5.2006, 10:12
Цитата(XPurple @  19.5.2006,  08:41 Найти цитируемый пост)
при запуске программа запускается не в фоновом режиме (форма курсора мышки меняется на песочные часы).

Это не программа работает, а ОС ее запускает и ждет возврата управления.

Цитата(XPurple @  19.5.2006,  10:47 Найти цитируемый пост)
исчезло свойство иконки (Icon)

Добавь в ресурсы икону с ID=1.

Цитата(XPurple @  19.5.2006,  08:41 Найти цитируемый пост)
Как сделать, чтобы программа запускалась в фоновом режиме ? 

Это тебе не ДОС и не Никсы - тут нет фонового режима, тут ногозадачность вытесняющая, понимаешь. Попробуй в начале программы DoEvents добавить... 

Автор: ~FoX~ 19.5.2006, 10:27
SetPriority тебе в руки  smile  

Автор: XPurple 19.5.2006, 12:21
Цитата(~FoX~ @  19.5.2006,  10:27 Найти цитируемый пост)
SetPriority 

Пишет, неизвестная функция или процедура.
  

Автор: boevik 19.5.2006, 13:19
Поосторожнее с приоритетами, а то система может перестать реагировать 

Автор: ~FoX~ 19.5.2006, 15:21
Цитата(XPurple @  19.5.2006,  13:21 Найти цитируемый пост)
Пишет, неизвестная функция или процедура.

Я погорячился, скорее тебе подойдет SetTheardPriority хотя смысл не меняется
Это АПИ функция, ее сначала надо определить:
Код

Public Declare Function SetThreadPriority Lib "Kernel32" _
(ByVal HANDLE As Long, _   ' Хэндл процесса
 ByVal nPriority As Long) _  ' Тип приоритета
As Boolean

Const THREAD_PRIORITY_LOWEST = -2 ' А это то что кладется в nPriority 
 

Автор: XPurple 19.5.2006, 22:06
Цитата(~FoX~ @  19.5.2006,  15:21 Найти цитируемый пост)
Public Declare Function SetThreadPriority Lib "Kernel32" _

Несколько раз встречал подобное выражение. Это означает использование функций не из  VB ?
 

Автор: cardinal 20.5.2006, 03:14
Это означает использование библиотеки kernel32.dll, а точнее API функции SetThreadPriority сидящей в этой библиотеке... 

Автор: Walera 22.5.2006, 04:57
а что должна делать твоя программа в фоновом режиме 

Автор: XPurple 22.5.2006, 06:29
Walera
Она должна считывать список файлов и фольдеров с сохранением в текстовом виде(файле). А почему именно в фоновом режиме -или как меня поправили - с более низким приоритетом (но не в этом суть), то данный процесс может затянуться на достаточно длительный период, хотелось бы обезопасить себя на случай длительного скана, чтобы процесс не тормозил систему.

Добавлено @ 06:37 
Вот так сделал пока. Взято из примеров, но почему-то везде в примерах указывают/объявляют SetPriotityClass, а не SetThreadPriority.
Чем эти функции различаются между собой ?
Код

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As _
Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function GetPriorityClass Lib "kernel32" (ByVal hProcess As _
Long) As Long

Public Enum Priority
   IDLE_PRIORITY_CLASS = &H40
   NORMAL_PRIORITY_CLASS = &H20
   HIGH_PRIORITY_CLASS = &H80
   REALTIME_PRIORITY_CLASS = &H100
End Enum

Public Sub SetPriority(pParam As Priority)
   SetPriorityClass GetCurrentProcess(), pParam
End Sub


Private Sub Form_Load()
SetPriority (IDLE_PRIORITY_CLASS)
'....
End sub

  

Автор: ~FoX~ 22.5.2006, 08:02
SetThreadPriority - устанавливает приоретет для потока
SetPriorityClass  - устанавливает приоритет для всех потоков процесса 

Автор: XPurple 22.5.2006, 10:13
Немного в оффтоп:
Как расчитать: какие используются потоки или хотя бы где почерпнуть соответствующую информацию ? 

Автор: Akina 22.5.2006, 10:18
Что-то мне подсказывает, что не в этом дело. Проблема имхо - в неверном написании кода самой программы.
Цитата(XPurple @  22.5.2006,  07:29 Найти цитируемый пост)
Она должна считывать список файлов и фольдеров с сохранением в текстовом виде(файле).

Дай код блока сканирования. 

Автор: XPurple 22.5.2006, 12:55
Akina
Код

Public Sub WriteListDir()

If fso.FolderExists(sourceDir) Then
Set fold = fso.GetFolder(sourceDir)
otf2.Write "Файлы в " & sourceDir & vbCrLf
dirListStatus = FileTree(fold)
'otf2.Close

Else
'msg = MsgBox("Папка " & sFile & " не найдена", vbInformation, "Результат")
End If

End Sub

Public Function ListFile(ByRef folder As Object) As String

For Each vfile In folder.Files
otf2.Write Chr(124) + String(6, 151) + Chr(62)
otf2.Write (vfile.Name) & vbCrLf
Next

End Function


Public Function FileTree(ByVal fold1 As folder) As String
'Public Function FileTree(ByVal fold1 As object) As String

For Each vdir In fold1.SubFolders
otf2.Write Chr(124) + String(3, 151) + Chr(62)
otf2.Write UCase(vdir.Name) & vbCrLf
FileTree = FileTree(vdir)
Next

msg = ListFile(fold1)
End Function
  

Автор: Akina 22.5.2006, 14:08
А что есть otf2? файл вывода? как открыт?

Думаю, именно тут источник проблем... попробуй кластеризовать вывод, типа такого:

Код

Const FlushPortion as long = 65536&
buffer = ""
FileHandle = FreeFile
Open FileName$ For Output As #FileHandle
...
buffer = buffer & NextDataToWrite
call FlushBuffer(buffer, FileHandle, False)
...
call FlushBuffer(buffer, FileHandle, True)
Close #FileHandle

...

Sub FlushBuffer(ByVal buffer as string, FileHandle as long, Done as boolean)
if Done then
   write #FileHandle, buffer;
   buffer = ""
ElseIf Len(buffer)>FlushPortion Then
   write #FileHandle, left(buffer, FlushPortion);
   buffer = mid(buffer, FlushPortion+1)
End If
end sub

  

Автор: XPurple 22.5.2006, 14:23
Akina
Вся программа
Код

Option Explicit
Const ForReading = 1, ForWriting = 2, ForAppending = 8
'Const IDLE_PRIORITY_CLASS = &H40
Dim fso, otf, gf, otf2 As Object
Dim fso1 As New FileSystemObject
Dim sourceDir, FileTreeFileName As String
Dim msg
Dim ConfFile, ResultFile, ResultDir As String
Dim confFileExist As Boolean
Dim fold As Object
Dim vfile As Object
Dim vdir As Object
Dim dirListStatus As String
Dim permissionFile As Boolean
Dim retval As Integer


Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As _
Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function GetPriorityClass Lib "kernel32" (ByVal hProcess As _
Long) As Long

Public Enum Priority
   IDLE_PRIORITY_CLASS = &H40
   NORMAL_PRIORITY_CLASS = &H20
   HIGH_PRIORITY_CLASS = &H80
   REALTIME_PRIORITY_CLASS = &H100
End Enum

Public Sub SetPriority(pParam As Priority)
   SetPriorityClass GetCurrentProcess(), pParam
End Sub




Private Sub Form_Load()
SetPriority (IDLE_PRIORITY_CLASS)

ConfFile = "filetree.ini"
confFileExist = ReadConfFile()
'ResultFile = ResultDir & "\" & FileTreeFileName
ResultFile = ResultDir & FileTreeFileName

On Error GoTo CheckError ' Turn on error handling.
    If confFileExist And fso.FolderExists(ResultDir) Then
    Set otf2 = fso.OpenTextFile(ResultFile, ForWriting, True)
    WriteListDir
    
    
    otf2.Close
    Else
    'msg = MsgBox("Файл resultDir" & fso.FolderExists(ResultDir) & " существует", vbInformation, "Результат")
    End If
 
CheckError:
permissionFile = PermissionAccess()

  End
End Sub

Public Function ReadConfFile() As Boolean

   Set fso = CreateObject("Scripting.FileSystemObject")
   If (fso.FileExists(ConfFile)) Then
        Set otf = fso.OpenTextFile(ConfFile, ForReading, True)
      Set gf = fso.GetFile(ConfFile)
             If gf.Size > 0 Then
           
             sourceDir = SelectString(otf, True)
             ResultDir = SelectString(otf, True)
             FileTreeFileName = SelectString(otf, False)
             'FileTreeFileName = SelectString(9)
             'otf.Skip (12)
             'ResultDir = otf.ReadLine()
             'otf.Skip (9)
             'FileTreeFileName = otf.ReadLine()
             
             'msg = MsgBox("Файл sFile" & ConfFile & " существует", vbInformation, "Результат")
             ReadConfFile = True
             'msg = MsgBox("Файл " & ConfFile & " нормальный", vbInformation, "Результат")
              Else
            'msg = MsgBox("Файл " & ConfFile & " пустой", vbInformation, "Результат")
            ReadConfFile = False
            
            End If
          otf.Close
    Else
      'msg = MsgBox("Файл " & ConfFile & " не найден", vbInformation, "Результат")
   End If
End Function

Public Sub WriteListDir()

If fso.FolderExists(sourceDir) Then
Set fold = fso.GetFolder(sourceDir)
otf2.Write "Файлы в " & sourceDir & vbCrLf
dirListStatus = FileTree(fold)
'otf2.Close
Else
'msg = MsgBox("Папка " & sFile & " не найдена", vbInformation, "Результат")
End If
End Sub

Public Function PermissionAccess() As Boolean
Const conErrPermissionDenied = 70
    If (Err.Number = conErrPermissionDenied) Then
    PermissionAccess = False
    'msg = MsgBox("Файл " & ResultFile & " не доступен", vbInformation, "Результат")
    Else
    'msg = MsgBox("Файл " & ResultFile & " доступен", vbInformation, "Результат")
    
    PermissionAccess = True
      End If
End Function

Public Function ListFile(ByRef folder As Object) As String

For Each vfile In folder.Files
otf2.Write Chr(124) + String(6, 151) + Chr(62)
otf2.Write (vfile.Name) & vbCrLf
Next

End Function


Public Function FileTree(ByVal fold1 As folder) As String
'Public Function FileTree(ByVal fold1 As object) As String
For Each vdir In fold1.SubFolders
otf2.Write Chr(124) + String(3, 151) + Chr(62)
otf2.Write UCase(vdir.Name) & vbCrLf
FileTree = FileTree(vdir)
Next
msg = ListFile(fold1)
End Function



Public Function SelectString(ByVal openReadConf As Object, ByVal CheckSlash As Boolean) _
As String
Dim valTemp As String
Dim position As Integer

valTemp = openReadConf.ReadLine()
position = InStr(1, valTemp, "=", vbTextCompare)
valTemp = Right(valTemp, Len(valTemp) - position)
'MsgBox valTemp

If Right(valTemp, 1) <> "\" And CheckSlash Then
SelectString = valTemp + "\"
Else
SelectString = valTemp
End If
End Function

  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)