创建线程方式不正确,还请高手帮忙啊

xujie839997 2006-03-17 09:20:29
type
TSerial =class(TObject)
private
commHandle:Cardinal;
public
function comReceive();
function comThread();
end;

以上是类的声明
function TSerial.omReceive();
begin
Com_Thread:=CreateThread(nil,0,@CommThread,nil,0,ThreadID);
end;

以上这种创建线程方式不正确,还请高手帮忙啊
...全文
154 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xujie839997 2006-03-19
  • 打赏
  • 举报
回复
我就是因为不能用Thread类才用API写的






-----------------------------------------
我奋斗一生的革命纲领:农妇-山泉-有点田
-----------------------------------------
趁年轻多学点东西,记住自己的两年目标!
-----------------------------------------
xujie839997 2006-03-19
  • 打赏
  • 举报
回复
多谢蜗牛兄!!
BlueTrees 2006-03-19
  • 打赏
  • 举报
回复
还有,为什么不能用TThread?告诉一个理由,我帮你解决它。
BlueTrees 2006-03-19
  • 打赏
  • 举报
回复
function comThread();
这种是类函数,不是普通函数,他隐藏了第一个参数--类的实例。

这种函数是不能作为回调函数使用的。

你应该把回调函数写成普通函数,并且符合CreatThread回调函数的格式。
BlueTrees 2006-03-19
  • 打赏
  • 举报
回复
2台电脑互联,要交叉数据线的,具体的线我也忘记了.你买线的时候跟老板说是电脑互联,不是电脑连接设备的,就可以了,老板都知道的.

此外win2000的帮助也有这个说明,奇怪吧,普通帮助查串口,或者RS232竟然有这方面的详细说明。
BlueTrees 2006-03-19
  • 打赏
  • 举报
回复
发不完,长度太长,只能连续3次
看我的Blog
http://blog.csdn.net/BlueTrees/archive/2006/03/19/629334.aspx
xujie839997 2006-03-19
  • 打赏
  • 举报
回复
还有,为什么我买了个串口线,两台电脑连不起来啊?要注意些什么问题吗,测试软件有没有
xujie839997 2006-03-19
  • 打赏
  • 举报
回复
继续啊
BlueTrees 2006-03-19
  • 打赏
  • 举报
回复

TEventType=(WriteErr,WriteOK,ReadOK,ReadErr,OpenComState,ComErr);

TProThread = class(TThread)
private
FReadPos:DWord;
FRetryTimes:Integer;
FComEvtMask:DWord;
FInputBuffer: array[0..INPUTBUFFERSIZE-1] of Char;
FNumberOfBytesRead:DWORD;
FWriteCallBuffered:Boolean;
FoverlappedRead:TOverlapped;
FoverlappedCommEvent:TOverlapped;
FoverlappedWrite:TOverLapped;
FComHandle:THandle;
FState:TProState;
FStateSection:TRTLCriticalSection;
FWriteCallEvent:THandle;
FCloseCallEvent:THandle;
FOpenComCallEvent:THandle;
FCloseComCallEvent:THandle;
FReadComeInEvent:THandle;
FWriteOverEvent:THandle;
FCommEvent:THandle;
FSetCommCallEvent:THandle;
FWriteBuf:TWriteReadBuf;
FReadBuf:TWriteReadBuf;
FComName: WideString;
FWriteTotalTimeoutMultiplier: DWORD;
FReadTotalTimeoutConstant: DWORD;
FReadIntervalTimeout: DWORD;
FReadTotalTimeoutMultiplier: DWORD;
FWriteTotalTimeoutConstant: DWORD;
FReplacedChar: AnsiChar;
FXoffChar: AnsiChar;
FXonChar: AnsiChar;
FIgnoreNullChar: Boolean;
FOutx_DsrFlow: Boolean;
FDsrSensitivity: Boolean;
FParityCheck: Boolean;
FTxContinueOnXoff: Boolean;
FOutx_XonXoffFlow: Boolean;
FInx_XonXoffFlow: Boolean;
FOutx_CtsFlow: Boolean;
FReplaceWhenParityError: Boolean;
FBaudRate: DWORD;
FByteSize: TByteSize;
FDtrControl: TDtrControl;
FParity: TParity;
FRtsControl: TRtsControl;
FStopBits: TStopBits;
FXoffLimit: WORD;
FXonLimit: WORD;
FOnCommErr: TErrorProc;
FOnReadErr: TErrorProc;
FOnWriteErr: TErrorProc;
FOnRead: TRecvDataProc;
FOnWriteOk: TNotifyProc;
FOnOpenCom:TErrorProc;
function RandomBool:Boolean;
function CheckRecvBuf(var Buf:TWriteReadBuf):Boolean;
procedure SetState(State:TProState);
procedure SetComName(const Value: WideString);
procedure SetCommState;
procedure SetCommTimeout;
procedure SetReadIntervalTimeout(const Value: DWORD);
procedure SetReadTotalTimeoutConstant(const Value: DWORD);
procedure SetReadTotalTimeoutMultiplier(const Value: DWORD);
procedure SetWriteTotalTimeoutConstant(const Value: DWORD);
procedure SetWriteTotalTimeoutMultiplier(const Value: DWORD);
procedure SetBaudRate(const Value: DWORD);
procedure SetByteSize(const Value: TByteSize);
procedure SetDsrSensitivity(const Value: Boolean);
procedure SetDtrControl(const Value: TDtrControl);
procedure SetIgnoreNullChar(const Value: Boolean);
procedure SetInx_XonXoffFlow(const Value: Boolean);
procedure SetOutx_CtsFlow(const Value: Boolean);
procedure SetOutx_DsrFlow(const Value: Boolean);
procedure SetOutx_XonXoffFlow(const Value: Boolean);
procedure SetParity(const Value: TParity);
procedure SetParityCheck(const Value: Boolean);
procedure SetReplacedChar(const Value: AnsiChar);
procedure SetReplaceWhenParityError(const Value: Boolean);
procedure SetRtsControl(const Value: TRtsControl);
procedure SetStopBits(const Value: TStopBits);
procedure SetTxContinueOnXoff(const Value: Boolean);
procedure SetXoffChar(const Value: AnsiChar);
procedure SetXoffLimit(const Value: WORD);
procedure SetXonChar(const Value: AnsiChar);
procedure SetXonLimit(const Value: WORD);
function SetupCommEvent: Boolean;
function SetupReadEvent: Boolean;
function WriteChar(C:Char):Boolean;
function WriteBuf(Buf:Pointer;Size:Integer):Boolean;
procedure CalcCRC16(var CRC: Word;Buf:Pointer;sz: integer);
function CalcBufCRC16(Buf:Pointer;Size:Integer;var CRC:WORD):Boolean;
function CheckCRC(Buf:Pointer;Size:Integer;CRC:WORD):Boolean;
procedure SetOnCommErr(const Value: TErrorProc);
procedure SetOnRead(const Value: TRecvDataProc);
procedure SetOnReadErr(const Value: TErrorProc);
procedure SetOnWriteErr(const Value: TErrorProc);
procedure SetOnWriteOk(const Value: TNotifyProc);
protected
procedure DoComErr(ErrID:Integer;ErrStr:WideString);
procedure DoOpenComState(ErrID:Integer;ErrStr:WideString);
procedure DoReadErr(ErrID:Integer;ErrStr:WideString);
procedure DoWriteErr(ErrID:Integer;ErrStr:WideString);
procedure DoReadOk;
procedure DoWriteOk;
procedure DoReadBegin;virtual;
procedure DoBreak;virtual;
procedure DoWriting;virtual;
procedure DoWriteBegin;virtual;
procedure DoReading;virtual;
procedure DoCloseCall;virtual;
procedure DoWaitTimeOut;virtual;
procedure DoWriteCall;virtual;
procedure DoCloseComCall;virtual;
procedure DoOpenComCall;virtual;
procedure DoWriteOver;virtual;
procedure DoRead;virtual;
procedure DoComm;virtual;
procedure DoSetCommCall;virtual;
procedure Execute; override;
public
property ComName:WideString read FComName write SetComName;
property ReadIntervalTimeout: DWORD read FReadIntervalTimeout write SetReadIntervalTimeout;
property ReadTotalTimeoutMultiplier: DWORD read FReadTotalTimeoutMultiplier write SetReadTotalTimeoutMultiplier;
property ReadTotalTimeoutConstant: DWORD read FReadTotalTimeoutConstant write SetReadTotalTimeoutConstant;
property WriteTotalTimeoutMultiplier: DWORD read FWriteTotalTimeoutMultiplier write SetWriteTotalTimeoutMultiplier;
property WriteTotalTimeoutConstant: DWORD read FWriteTotalTimeoutConstant write SetWriteTotalTimeoutConstant;
property BaudRate: DWORD read FBaudRate write SetBaudRate;
property ParityCheck: Boolean read FParityCheck write SetParityCheck;
property Outx_CtsFlow: Boolean read FOutx_CtsFlow write SetOutx_CtsFlow;
property Outx_DsrFlow: Boolean read FOutx_DsrFlow write SetOutx_DsrFlow;
property DtrControl: TDtrControl read FDtrControl write SetDtrControl;
property DsrSensitivity: Boolean read FDsrSensitivity write SetDsrSensitivity;
property TxContinueOnXoff: Boolean read FTxContinueOnXoff write SetTxContinueOnXoff;
property Outx_XonXoffFlow: Boolean read FOutx_XonXoffFlow write SetOutx_XonXoffFlow;
property Inx_XonXoffFlow: Boolean read FInx_XonXoffFlow write SetInx_XonXoffFlow;
property ReplaceWhenParityError: Boolean read FReplaceWhenParityError write SetReplaceWhenParityError;
BlueTrees 2006-03-19
  • 打赏
  • 举报
回复
unit ProThread;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ComErrorCode, ErrorStr;

type

TRecvDataProc = procedure (Buf:Pointer;Size:Integer);stdcall;
TErrorProc = procedure (ID:Integer;ErrStr:PWideChar);stdcall;
TNotifyProc = procedure;stdcall;

TProState = (ProNone,ProBreak,ProWriteBegin,ProWriting,ProReading,ProReadBegin);

TParity = ( None, Odd, Even, Mark, Space );
TStopBits = ( _1, _1_5, _2 );
TByteSize = ( _5, _6, _7, _8 );
TDtrControl = ( DtrEnable, DtrDisable, DtrHandshake );
TRtsControl = ( RtsEnable, RtsDisable, RtsHandshake, RtsTransmissionAvailable );

TFrame = Int64;
PFrame = ^TFrame;

TWriteReadBuf = packed record
Head:BYTE;
Buf:TFrame;
Check:WORD;
Re:BYTE;
end;

EComError = class( Exception );

const
INPUTBUFFERSIZE = 32;
RetryTimes = 8;

type
BlueTrees 2006-03-19
  • 打赏
  • 举报
回复
串口如何编程,我想你应该知道了。

我也懒得说了,我把我的大作,附带了协议的Com和循环冗余校验口通讯单元送给你吧。

那个Com口通讯协议是我自己开发的,通常Com口是无连接的,或者使用控制线的,但是,那个做下位机器的老兄,实在太滥了,就给了我3根线,一根底线,一根收,一根发。搞得我没办法只好写了这么个通讯协议,而且,下位机才1个字节的缓存,这个老兄真,不知道怎么说他好,用C语言竟然不知道类型转换的,转换一下类型就赋值一次,搞得我这pascal程序员都喷饭了。而且还不知道怎么用定时器,我说要是上位机不给你发送数据了,你的下位机就卡死在那里不动了吗(因为包含同步协议的,他接受要等待的)?他瞪着眼睛看着我说,还有这样的问题啊?我怎么没想到,我差点从桌子上笑翻到了地上。



都过去了2年多了,我现在看那时候的程序,感觉是看天书,真不知道那是怎么这么厉害。

你慢慢看吧,或者就照抄吧,这个是反复测试过的,在两台电脑之间传输过很多次,其实有个Bug我一直查不出来,按照协议是不会这样的,可能是我的定时器用的不对,我用等待延时的,其实不正确的。就是,发送很多数据后,会同步协议会失锁,然后要经过很长时间的握手后才能继续同步。

xujie839997 2006-03-19
  • 打赏
  • 举报
回复
先谢谢楼上的兄弟!

我是想写一个RS232的串口类,要求具有如下方法
1.设置串口基本参数
2.打开串口连接
3.关闭串口连接
4.往缓冲区发送命令数据
5.读取缓冲区数据
6.判断串口是否打开
另要求,该类采用多线程机制等待下位机传送的数据


这个等待下位机传送的数据我怎么在类中实现多线程,这个我搞不清楚!如能帮我解决,真是太感激您了!!
elite01 2006-03-18
  • 打赏
  • 举报
回复
TYourThread = class(TThread)
private
FFrequency : Cardinal;
protected
procedure Execute; override;
public
constructor Create(const AFrequency : Cardinal);//覆盖了构造方法
end;


constructor THeartbeatThr.Create(const AFrequency : Cardinal);
begin
FFrequency := AFrequency;//这里可作些初始的工作
inherited Create(True);
end;

procedure THeartbeatThr.Execute;

begin
FreeOnTerminate := True;
{ your code}

end;
linzhengqun 2006-03-17
  • 打赏
  • 举报
回复
用TThread类

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧