Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

Процессы и сокеты   Найти похожие ветки 

 
balepa   (2006-03-10 09:13) [0]

При запросе от клиента на подключение нужно создать новый процесс и в этом процессе подключить этого клиента (Socket).


 
Сергей М. ©   (2006-03-10 09:31) [1]

Может быть все-таки не процесс а нить (thread) ?
Это же разные по сути объекты ..


 
balepa   (2006-03-10 09:37) [2]


> Сергей М. ©   (10.03.06 09:31) [1]
> Может быть все-таки не процесс а нить (thread) ?
> Это же разные по сути объекты ..


Можно сказать не процесс,а другую программу, в которой надо осуществить подключение этого клиента.
С потоками не получилось. Программа на VB. Примеры можно дать хоть на чем. Или подскажите в какую сторону копать?


 
Сергей М. ©   (2006-03-10 09:42) [3]


> balepa   (10.03.06 09:37) [2]


> Можно сказать не процесс,а другую программу


Другая программа и есть другой процесс.


> в которой надо осуществить подключение этого клиента


А чем тогда данная программа занимается, если не подключением ?


> С потоками не получилось. Программа на VB


Программа на VB тоже может быть многопоточной, ничто этому не мешает.


 
balepa   (2006-03-10 09:52) [4]

В VB не получилось в потоке Открыть Excelе"вский документ


 
Сергей М. ©   (2006-03-10 09:57) [5]

Что значит "не получилось" ?


 
balepa   (2006-03-10 10:02) [6]

Создаю так:
ThreadHandle = CreateThread(mNull, 2000, AddressOf Grafik1, GIndex, CREATE_SUSPENDED, Thread_ID)
SetThreadPriority ThreadHandle, THREAD_PRIORITY_LOWEST
ResumeThread ThreadHandle

На строке (в процедуре Grafik1) Workbook.Open FileName.Вылазит Ошибка Automation Error. Может поток не правильно создаю (в этом не сомневаюсь)? Подскажи как правильно или где почитать


 
Сергей М. ©   (2006-03-10 10:05) [7]

Стек потока слишком мал.
Поставь 0.

Покажи свою декларацию и реализацию ф-ции CreateThread().


 
balepa   (2006-03-10 10:07) [8]

Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
(VB 5.0)
В смысле реализацию?


 
Сергей М. ©   (2006-03-10 10:10) [9]


> В смысле реализацию?


Пардон ...
Реализацию ф-ции Grafik1() покажи ..


 
balepa   (2006-03-10 10:15) [10]

Public Type TRequest
   RSDate As Date
   REDate As Date
   RSTime As Date
   RETime As Date
   RParam(0 To 99) As Byte
   RCount As Byte
   RTip As Byte
   RArchiv As Byte
   RBlok As Byte
   RFrNomer0 As Byte
   RFrNomer As Integer
End Type

   Public Request(1 To 10) As TRequest
   Public Bl As String
   Public Metka As Byte     "интервал меток 0-сутки,1-месяц
   Public АБК As Byte       "ПРИЗНАК работы по обработки для АБК (0 - mzal, 1 - АБК)
   Public fileАБК As String "запрос...
   Dim avarData1() As Date
   Dim avarData2() As Variant "массив значений параметров
   Dim avarData3() As Variant
   Public NomerVod1 As Long
   Public Now2 As Date
   Public Dat11 As Date
   Public Dat12 As Date
   Public BlokN As Byte
   Public s1
   Public STEPn
   Public Fvr As Date
   Public Fvr1 As Date
   Public Fvr2 As Date
   Public FrNomer As Integer       "номер фрагмента (1-100, 101-200,....,801-900)
   Public FrNomer0 As Integer
   Public Sdvig As Integer
   Public ПечатьXLS As String      "файл начальной формы
   Public MetkaU As Byte               "метка осчета времени
   Public AdamN
   Public AdamTip              "если AdamTip = 1 данные с ADAM
   Public i2
   Dim h As Date
   Public NomerVodK
   Dim DN(1 To 1380) As Integer    "массив пришедших значений
   Dim Kkk1 As Integer
   Dim NowFill As Byte             "признак обнавления
   "Dim CurUser As String           "имя компьютера
   Public count1 As Byte
   Public P1(99) As Byte
   Public Tip As Byte
   Dim Archiv As Byte
   Public Const MAX_ACTIVE_SERVERS = 10
   "Public GIndex As Byte
   Public queues(1 To MAX_ACTIVE_SERVERS) As Byte
Sub Grafik1(GIndex As Byte)
"On Error GoTo khj:
start:
   Work = True
   Form1.Timer1.Enabled = False
   Blok = "Блок" + Format(Request(GIndex).RBlok + 1)
   Bl = Request(GIndex).RBlok + 1
   k = Request(GIndex).REDate - Request(GIndex).RSDate
   Request(GIndex).RArchiv = 1
   Dim Step0 As Date
   If k < 0.25 Then        "печать 0.25 <6 часов
       Step0 = "0:00:01"
       ПечатьXLS = "c:\печать\печать0.xls"
       Metka = 0
       Request(GIndex).RArchiv = 0
       GoTo m
   End If
   Request(GIndex).RSDate = ((Request(GIndex).RSDate * 24 - 0.5) \ 1) / 24  "привязка к часу
   If k < 1 Then       "печать 1 от 6 часов до 23-59-59
       Step0 = "0:00:10"
       ПечатьXLS = "c:\печать\печать1.xls"
       Metka = 0
       Request(GIndex).RArchiv = 0
   ElseIf k < 2 Then       "печать 2 с 24 ч до 48 ч 59 м 58 сек
       Step0 = "0:00:20"
       ПечатьXLS = "c:\печать\печать2.xls"
       Metka = 0
       Request(GIndex).RArchiv = 0
   ElseIf k < 4 Then       "печать 4
       Step0 = "0:00:30"
       ПечатьXLS = "c:\печать\печать4.xls"
       Metka = 0
       Request(GIndex).RArchiv = 0
   ElseIf k < 15 Then      "печать 15
       Step0 = "0:02:00"
       ПечатьXLS = "c:\печать\печать15.xls"
       Metka = 0
   ElseIf k < 30 Then      "печать 30
       Step0 = "0:05:00"
       ПечатьXLS = "c:\печать\печать30.xls"
       Metka = 0
   ElseIf k < 60 Then      "печать 60
       Step0 = "0:10:00"
       ПечатьXLS = "c:\печать\печать60.xls"
       Metka = 0
   ElseIf k < 180 Then     "печать 180
       Step0 = "0:30:00"
       ПечатьXLS = "c:\печать\печать180.xls"
       Metka = 1
   ElseIf k < 360 Then     "печать 360
       Step0 = "1:00:00"
       ПечатьXLS = "c:\печать\печать360.xls"
       Metka = 1
   ElseIf k < 720 Then     "печать 720
       Step0 = "2:00:00"
       ПечатьXLS = "c:\печать\печать720.xls"
       Metka = 1
   Else                    "печать 1000
       Step0 = "4:00:00"
       ПечатьXLS = "c:\печать\печать1000.xls"
       Metka = 1
   End If
   d00 = Request(GIndex).RSDate * 60 * 60 * 24
   s00 = Step0 * 60 * 60 * 24
   d1 = (((d00 / s00) - 0.5) \ 1) * s00
   Request(GIndex).RSDate = d1 / 60 / 60 / 24 "23:59:59 -> 23:59:50 Step0 = 00:00:10
   d00 = Request(GIndex).REDate * 60 * 60 * 24
   s00 = Step0 * 60 * 60 * 24
   d1 = (((d00 / s00) - 0.5) \ 1) * s00
   Request(GIndex).REDate = d1 / 60 / 60 / 24 "23:59:59 -> 23:59:50 Step0 = 00:00:10
m:  i3 = 0
   dat1 = Format(Request(GIndex).RSDate, "dd-mmm-yyyy hh-mm")
   dat2 = Format(Request(GIndex).REDate, "dd-mmm-yyyy hh-mm")
   Form1.Label4.Caption = ""
   For j = 0 To Request(GIndex).RCount - 1 "цикл по отмеченым СНП
       If Request(GIndex).RParam(j) <> 0 Then
           lll = Request(GIndex).RParam(j) + Request(GIndex).RFrNomer
           If lll > 1478 Then
               lll = lll - 278
           End If
           s1 = PNP_GP(Request(GIndex).RBlok, lll)
           If s1 = 0 Then GoTo m1
           If Metka = 0 Then
               MetkaU = Day(Request(GIndex).RSDate)
           Else
               MetkaU = Month(Request(GIndex).RSDate)
           End If


 
balepa   (2006-03-10 10:15) [11]

ReDim avarData1(30000, 1)
           ReDim avarData2(30000, 1)
           ReDim avarData3(30000, 1)
           If U2 = 1 Then i3 = 0: s0 = 0
           h = Format(Request(GIndex).RSDate, "dd.mm.yy")
m0:         Form1.Label4.Caption = "Обработка " + Format(lll, "000") + " " + Format(h)
           mes = Month(h)
           Fil = Day(h)
           If Request(GIndex).RTip = 0 Then     "если ГП
               If Request(GIndex).RArchiv = 1 Then        "если архив
                   Fil1 = "\\mzal" + Bl + "\Блок" + Bl + " Архив\" + Format(h, "yyyy") + "\" + Format(h, "mm") + "\arxiv" + Bl + "-" + Format(h, "yy-mm-dd") + ".asu"
                   Fil2 = "D:\Блок" + Bl + " Архив\" + Format(h, "yyyy") + "\" + Format(h, "mm") + "\arxiv" + Bl + "-" + Format(h, "yy-mm-dd") + ".asu"
               Else
                   Fil1 = "\\mzal" + Bl + "\Блок" + Bl + " Gak\" + Format(h, "yyyy") + "\" + Format(h, "mm") + "\gak" + Bl + "-" + Format(h, "yy-mm-dd") + ".asu"
                   Fil2 = "D:\Блок" + Bl + " Gak\" + Format(h, "yyyy") + "\" + Format(h, "mm") + "\gak" + Bl + "-" + Format(h, "yy-mm-dd") + ".asu"
               End If
               STEPn = (1200 + 128 + 20 + 16 * 4 + 13) * 2 + 8
               AdamTip = 0
               PathT = "гп.xls"
               hk = 0
               
               Fvr1 = Step0
               If Fvr1 <= "00:00:09" Then
                   Fvr1 = "00:00:01"
               End If
               Call File2(Form1, Fil1, Fil2, hk, u, s0, U2, DN, GIndex)
               тип = " (ГП)"
           Else
               If AdamO(Request(GIndex).RBlok, s1) = 0 Then GoTo m1
               If Request(GIndex).RArchiv = 1 Then        "если архив
                   Now24h = h
                   Fil1 = "\\Adamblok2\ADAM архив 2\" + Format(Now24h, "yyyy") + "\" + Format(Now24h, "mm") + "\Adam архив2 " + Format(Now24h, "yy-mm-dd") + ".ASU"
                   Fil2 = "D:\ADAM архив 2\" + Format(Now24h, "yyyy") + "\" + Format(Now24h, "mm") + "\Adam архив2 " + Format(Now24h, "yy-mm-dd") + ".ASU"
               Else
                   now3 = h
                   f = Format(now3, "YY-mm-dd")
                   Fil1 = "\\Adamblok2\adam блок 2\" + Format(now3, "yyyy") + "\" + Format(now3, "mm") + "\AdamGP2 " + f + ".ASU"
                   Fil2 = "d:\adam блок 2\" + Format(now3, "yyyy") + "\" + Format(now3, "mm") + "\AdamGP2 " + f + ".ASU"
               End If
               STEPn = 32 * 10 * 2 + 8 + 10
               AdamTip = 1
               PathT = "adam.xls"
               a1 = Adam(Request(GIndex).RBlok, s1) Mod 32
               a2 = Adam(Request(GIndex).RBlok, s1) \ 32
               AdamN = Adam(Request(GIndex).RBlok, s1)
               hk = h
               Fvr1 = Step0
               Call File2(Form1, Fil1, Fil2, hk, u, s0, U2, DN, GIndex)
               тип = " (ADAM)"
           End If
           If u = 1 And h <= Date Then GoTo m0
           NowFill = 1
           Form1.Label4.Caption = "Сохранение " + Format(lll, "000")
           If open1 = 0 Then
               Workbooks.Open ПечатьXLS
               open1 = 1
           End If
           Form1.Label4.Caption = "zarabota"
           THour4 = Format(tim1, "dd mmmm yyyy")
           NameG = Blok + " " + Format(lll) + " " + texName(Request(GIndex).RBlok, s1) + "c " + dat1 + "  по  " + dat2
           Sheets("данные").Cells(1, 2).Value = NameG + тип
           If Metka = 2 Then
               Sheets("данные").Cells(1, 3).Value = "час"
           ElseIf Metka = 0 Then
               Sheets("данные").Cells(1, 3).Value = "сутки"
           Else
               Sheets("данные").Cells(1, 3).Value = "месяц"
           End If
           hhh = "a2:a" + Format(i2 - 1)
           Sheets("данные").Range(hhh).Value = avarData1
           K9 = "="данные"!$A$1:$C$" & i2
           Charts("Принтер 1").ChartWizard Source:=Range(K9)
           Charts("Принтер 2").ChartWizard Source:=Range(K9)
           Charts("Принтер 1 (авто)").ChartWizard Source:=Range(K9)
           Charts("Принтер 2 (авто)").ChartWizard Source:=Range(K9)
           With Charts("Принтер 1").Axes(xlValue)
               .MaximumScale = ВГ(Request(GIndex).RBlok, s1)
               .MinimumScale = НГ(Request(GIndex).RBlok, s1)
           End With
           With Charts("Принтер 2").Axes(xlValue)
               .MaximumScale = ВГ(Request(GIndex).RBlok, s1)
               .MinimumScale = НГ(Request(GIndex).RBlok, s1)
           End With
           Path1 = "C:\WINDOWS\Рабочий стол\Рас Блок график\"
           
           hhh = "b2:b" + Format(i2 - 1)
           Sheets("данные").Range(hhh).Value = avarData2
           
           hhh = "c2:c" + Format(i2 - 1)
           Sheets("данные").Range(hhh).Value = avarData3
           
           Path0 = Blok + "  " + dat1 + " по " + dat2 + "  пнп-" + Format(lll, "000") + PathT
           Open Path1 + Path0 For Binary As #11
           Close #11
           Kill Path1 + Path0
           ActiveWorkbook.SaveAs Path1 + Path0
           u = 0
           Beep
       End If
m1: Next j
   If open1 = 1 Then
       ActiveWorkbook.Close "Path0
       open1 = 0
   End If
   NowFill = 0
   Form1.Label4.Caption = ""
 
   "KolZap = KolZap - 1
   mSendData = "OK"
   Form1.tcpServer1(GIndex).SendData mSendData
khj: Form1.Label7.Caption = Err.Description
"    ExitThread 0
End Sub


 
Сергей М. ©   (2006-03-10 10:23) [12]


> Вылазит Ошибка Automation Error


Код ошибки какой ?

p.s. Есть подозрение, что VB-менеджер памяти не потокобезопасен.


 
balepa   (2006-03-10 10:25) [13]

Automation error (Error 440)
When you access Automation objects, specific types of errors can occur. This error has the following cause and solution:

· An error occurred while executing a method or getting or setting a property of an object variable. The error was reported by the application that created the object.

Check the properties of the Err object to determine the source and nature of the error. Also try using the On Error Resume Next statement immediately before the accessing statement, and then check for errors immediately following the accessing statement.

For additional information, select the item in question and press F1.


 
Сергей М. ©   (2006-03-10 10:32) [14]

А собственно где и как создаются Excel-объекты WorkBook, Sheets и т.д. ?


 
balepa   (2006-03-10 10:39) [15]

1 способ: Project -> References -> стаим галочку (OLE Automations или Microsoft Excel 8.0 object library), вроде
2 способ:
Dim AppXL As Object, XL As Object

Set AppXL = CreateObject("Excel.application") "вот здесь тоже вылазит ошибка
Set XL = AppXL.Application

XL.Workbooks.Open file
XL.Worksheets("Данные").Range("A1").Value = s


 
balepa   (2006-03-10 10:41) [16]


> 1 способ: Project -> References -> стаим галочку (OLE Automations
> или Microsoft Excel 8.0 object library), вроде

Потом просто обращаешся к workbook.Open FileName и т. д. (как у меня и сделано)


 
Сергей М. ©   (2006-03-10 10:45) [17]


> Set AppXL = CreateObject("Excel.application") "вот здесь
> тоже вылазит ошибка


Какая ошибка ? И где эта строчка в коде нити ? Не вижу ...

XL.Workbooks.Open - это функциональный, а не процедурный метод.
При успехе он возвращает объект Workbook, к которому впоследствии и следует обращаться для работы с сего св-вом-коллекцией Worksheets

XL.Worksheets("Данные") - эта строчка не верна, потому что у объекта XL нет св-ва Worksheets.


 
Сергей М. ©   (2006-03-10 10:50) [18]

Кстати, а при чем тут сокеты ?
Что-то не наблюдаю я в коде нити никаких сокетов ...


 
balepa   (2006-03-10 10:51) [19]

В этом коде нет, но я и так пробовал (вставлял в начало проц-ы Grafik1)

> XL.Worksheets("Данные") - эта строчка не верна, потому что
> у объекта XL нет св-ва Worksheets.

А почему тогда работает (в другой программе) не первый год между прочим так что оно у него есть


 
Сергей М. ©   (2006-03-10 10:54) [20]


> В этом коде нет, но я и так пробовал (вставлял в начало
> проц-ы Grafik1)


И что при этом не получилось ?


> почему тогда работает (в другой программе)


Очевидно потому что там переменная XL содержит ссылку на объект Workbook, а не на Application


 
balepa   (2006-03-10 11:02) [21]

Set AppXL = CreateObject("Excel.application")
ошибка не помню уже какая (а может вообще вылетала программа). Но точно дальше этой строчки п-ра не выполнялась


 
Сергей М. ©   (2006-03-10 11:10) [22]


> дальше этой строчки п-ра не выполнялась


Ну так а о каком же вызове XL.Workbooks.Open может идти речь, если сам объект Application не был создан ?

И вообще я бы посоветовал обратиться со своей проблемой в какой-либо форум по VB .. Здесь все-таки Делфи-форум ..

Либо переноси нужную тебе функциональность (сокеты там или что-то еще) в DLL, написанную в Делфи, и вызывай из нее готовые ф-ции в своей VB-программе ... так и проще и разговор предметнее


 
balepa   (2006-03-10 11:29) [23]


> Ну так а о каком же вызове XL.Workbooks.Open может идти
> речь, если сам объект Application не был создан ?

???
Да я уже подумывал о полном переходе на Delphi. Тока переписывать не очень охота с VB на Delphi.
Думаете из DLL это заработает (всмысле откроется документ Excel)?

Как думаете если делать вот так ето будет правильно

> procedure TForm1.Button1Click(Sender: TObject);
> begin
>   Thread:= MThread.Create(True);
>   Thread.Priority:= tpLower;
>   Thread.Resume;
> end;


Модуль потока

> procedure MTHread.Grafik;
> var
>   s: string;
>   Excel, Sheet: Variant;
> begin
>   Excel:= CreateOleObject("Excel.Application.8");
>   Excel.Visible := False;
>   Excel.Workbooks.Open("c:\Мои документы\Книга1.xls");
>   Sheet := Excel.Workbooks[1].WorkSheets[1];
>   gs:= sheet.cells[1,1]; //[строка, столбец]
>   Form1.Label1.Caption:= gs;
>   Excel.Workbooks.Close;
>   Excel.Quit;
> end;



> procedure MThread.Execute;
> var
>   s: string;
>   Excel, Sheet: Variant;
> begin
    //без Synchronize не срабатывает
>   Synchronize(grafik)
> end;

Где можно подробнее узнать что делает Synchronize (вроде надо вызывать при обращении к VCL, тогда почему без него не работает Grafik, или Excel тоже входит в VCL)


 
balepa   (2006-03-10 11:33) [24]

p.s. Без Synchronize. Не был произведен вызов CoInitialize как вызвать и что это такое


 
Сергей М. ©   (2006-03-10 11:34) [25]


> ???


Что конкретно непонятно ?


> из DLL это заработает (всмысле откроется документ Excel)?


А куда оно денется !)


> если делать вот так ето будет правильно


Кое-что правильно, но многое требует серьезной доработки-переработки ..


> почему без него не работает Grafik


Что значит "не работает" ?


 
Сергей М. ©   (2006-03-10 11:37) [26]


> Не был произведен вызов CoInitialize как вызвать и что это
> такое


Что это - про то можно почитать в станд.справке.

А вкратце следует сделать так:

CoInitialize(nil);
try
.. здесь работаем с OLE-объектом, начиная с его создания и вплоть до его уничтожения
finally
 CoUninitialize;
end;


 
balepa   (2006-03-10 11:42) [27]

Огромное спасибо, за то что уделили мне время и отдельную благодарность за CoInitialize. Буду пробовать. А в справке чето не нашел но как говориться смотришь в книгу видиш фигу


 
Сергей М. ©   (2006-03-10 11:48) [28]


> в справке чето не нашел


Открываешь msdn.microsoft.com, водишь модель поиска "CoInitialize", получаешь информацию, изучаешь, делаешь выводы.


 
balepa   (2006-03-10 11:54) [29]

Попробовал выдает Undeclared identifier: "CoInitialize".Подключать надо что-то ? Заранее Спасибо.
Почитаю.


 
balepa   (2006-03-10 11:58) [30]

Вызывать из OLE32.dll ?


 
Сергей М. ©   (2006-03-10 11:59) [31]


> Подключать надо что-то ?


Разумеется !

В дан.случае - юнит ActiveX, именно там декларирован этот идентификатор.


 
Сергей М. ©   (2006-03-10 12:00) [32]


> Вызывать из OLE32.dll ?


Непосредственно из VB-программы - да, именно оттуда.


 
balepa   (2006-03-10 12:02) [33]

Спасибо отключаюсь, буду "мучиться"


 
Сергей М. ©   (2006-03-10 12:06) [34]


> буду "мучиться"


Творческих тебе узбеков !


 
BiN ©   (2006-03-10 13:19) [35]

А сокеты между процессами можно передавать с помощью DuplicateHandle.


 
SHAB ©   (2006-05-22 12:10) [36]

Удалено модератором


 
Polevi ©   (2006-05-23 09:51) [37]

Удалено модератором


 
begin...end ©   (2006-05-23 10:05) [38]

Удалено модератором


 
Polevi ©   (2006-05-23 10:18) [39]

Удалено модератором


 
begin...end ©   (2006-05-23 10:25) [40]

Удалено модератором



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.046 c
6-1146596297
Evereve
2006-05-02 22:58
2006.09.24
блокировать соединение с Интернетом


2-1157398753
TimScorp
2006-09-04 23:39
2006.09.24
FreeReport


2-1157546664
term1t
2006-09-06 16:44
2006.09.24
FastReport 2,4


5-1139839358
Святослав
2006-02-13 17:02
2006.09.24
Как запустить процедуру после установки Parent?


2-1157308619
Juri
2006-09-03 22:36
2006.09.24
Что делать если Windows 2000 professional не понимает приложение?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский