Форум: "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.042 c