现在有一个阿尔泰数据2813采集卡,只给出了VC和VB的程序实例,但是我想用VB.net来写,不知道*.bas能不能用在Vb.net中?或者修改一下语法和关键字能不能用?
非软件专业,所以不太清楚,现在课题需要编写简单的控制程序,请各位大神支招,不胜感激!!
下面给出模块文件“USB2813.bas”文件:
非软件专业,所以不太清楚,现在课题需要编写简单的控制程序,请各位大神支招,不胜感激!!
下面给出模块文件“USB2813.bas”文件:
'***********************************************************
' 用于AD采集的参数结构
Type USB2813_PARA_AD
FirstChannel As Long ' 首通道,取值范围为[0, 15]
LastChannel As Long ' 末通道,取值范围为[0, 15]
InputRange As Long
GroundingMode As Long
End Type' AD硬件参数(USB2813_PARA_AD)中的InputRange模拟量输入范围所使用的选项
Public Const USB2813_INPUT_N10000_P10000 = &H0 ' ±10000mV(默认配置)
Public Const USB2813_INPUT_N5000_P5000 = &H1 ' ±5000mV
Public Const USB2813_INPUT_N0_P10000 = &H2 ' 0~10000mV' AD参数(USB2813_PARA_AD)中的GroundingMode使用的模拟信号接地方式选项
Public Const USB2813_GNDMODE_SE = &H0 ' 单端方式(SE:Single end)
Public Const USB2813_GNDMODE_DI = &H1 ' 双端方式(DI:Differential)'***********************************************************
' 8253计数器控制字
Type USB2813_PARA_CNT ' 计数器控制字(CONTROL)
OperateType As Byte ' 操作类型
CountMode As Byte ' 计数方式
CountType As Byte ' 计数类型
End Type' USB2813_PARA_CNT_CTRL参数结构体各成员使用的选项
' 操作类型(OperateType)
Public Const USB2813_OPT_TYPE_0 = &H0 ' 计数器锁存操作
Public Const USB2813_OPT_TYPE_1 = &H1 ' 只读/写低字节
Public Const USB2813_OPT_TYPE_2 = &H2 ' 只读/写高字节
Public Const USB2813_OPT_TYPE_3 = &H3 ' 先读/写低字节,后读/写高字节
' 计数方式(CountMode)
Public Const USB2813_CNT_MODE_0 = &H0 ' 计数方式0,计数器结束中断方式
Public Const USB2813_CNT_MODE_1 = &H1 ' 计数方式1,可编程单次脉冲方式
Public Const USB2813_CNT_MODE_2 = &H2 ' 计数方式2,频率发生器方式
Public Const USB2813_CNT_MODE_3 = &H3 ' 计数方式3,方波频率发生器方式
Public Const USB2813_CNT_MODE_4 = &H4 ' 计数方式4,软件触发选通方式
Public Const USB2813_CNT_MODE_5 = &H5 ' 计数方式5,硬件触发选通方式
' 计数类型(BCD)
Public Const USB2813_CNT_TYPE_BIN = &H0 ' 计数类型0,二进制计数
Public Const USB2813_CNT_TYPE_BCD = &H1 ' 计数类型1,BCD码计数'***********************************************************
' 用于开关量输出的参数结构
Type USB2813_PARA_DO ' 数字量输出参数
DO0 As Byte ' 0通道
DO1 As Byte ' 1通道
DO2 As Byte ' 2通道
DO3 As Byte ' 3通道
DO4 As Byte ' 4通道
DO5 As Byte ' 5通道
DO6 As Byte ' 6通道
DO7 As Byte ' 7通道
End Type'***********************************************************
' 用于开关量输入的参数结构
Type USB2813_PARA_DI ' 数字量输入参数
DI0 As Byte ' 0通道
DI1 As Byte ' 1通道
DI2 As Byte ' 2通道
DI3 As Byte ' 3通道
DI4 As Byte ' 4通道
DI5 As Byte ' 5通道
DI6 As Byte ' 6通道
DI7 As Byte ' 7通道
End Type'***********************************************************
' CreateFileObject中的Mode参数使用的文件操作方式控制字(可通过或指令实现多种方式并操作)
Public Const USB2813_modeRead = &H0 ' 只读文件方式
Public Const USB2813_modeWrite = &H1 ' 只写文件方式
Public Const USB2813_modeReadWrite = &H2 ' 既读又写文件方式
Public Const USB2813_modeCreate = &H1000 ' 如果文件不存可以创建该文件,如果存在,则重建此文件,并清0'***********************************************************
' 驱动函数接口'######################## 常规通用函数 #################################
Declare Function USB2813_CreateDevice Lib "USB2813" (Optional ByVal DeviceLgcID As Integer = 0) As Long ' 创建设备对象(使用设备逻辑号)
Declare Function USB2813_CreateDeviceEx Lib "USB2813" (Optional ByVal DevicePhysID As Integer = 0) As Long ' 创建设备对象(使用设备物理号), DevicePhysID指定的物理号由板上DID拔码器实现)
Declare Function USB2813_GetDeviceCount Lib "USB2813" (ByVal hDevice As Long) As Integer ' 取得USB2813在系统中的设备数量
Declare Function USB2813_GetDeviceCurrentID Lib "USB2813" (ByVal hDevice As Long, ByRef DeviceLgcID As Long, ByRef DevicePhysID As Long) As Boolean ' 取得当前设备的物理ID号和逻辑ID号
Declare Function USB2813_ListDeviceDlg Lib "USB2813" () As Boolean ' 用对话框列表系统当中的所有USB2813设备
Declare Function USB2813_ResetDevice Lib "USB2813" (ByVal hDevice As Long) As Boolean ' 复位整个USB设备
Declare Function USB2813_ReleaseDevice Lib "USB2813" (ByVal hDevice As Long) As Boolean ' 设备句柄'####################### AD数据读取函数 #################################
Declare Function USB2813_InitDeviceAD Lib "USB2813" (ByVal hDevice As Long, ByRef pADPara As USB2813_PARA_AD) As BooleanDeclare Function USB2813_ReadDeviceAD Lib "USB2813" (ByVal hDevice As Long, ByRef ADBuffer As Integer, ByVal nReadSizeWords As Long, ByRef nRetSizeWords As Long) As Boolean ' 实际返回数据的长度(字)Declare Function USB2813_ReleaseDeviceAD Lib "USB2813" (ByVal hDevice As Long) As Boolean ' 停止AD采集,释放AD对象所占资源'################# AD的硬件参数操作函数 ########################
Declare Function USB2813_SaveParaAD Lib "USB2813" (ByVal hDevice As Long, ByRef pADPara As USB2813_PARA_AD) As Boolean
Declare Function USB2813_LoadParaAD Lib "USB2813" (ByVal hDevice As Long, ByRef pADPara As USB2813_PARA_AD) As Boolean'####################### DA数据输出函数 #################################
' 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备
' 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面一个函数便能轻
' 松实现高速、连续的DA数据输出
Declare Function USB2813_WriteDeviceDA Lib "USB2813" (ByVal hDevice As Long, ByVal nDALsb As Integer, ByVal nDAChannel As Integer) As Boolean'##################### 计数器控制函数 ##########################
Declare Function USB2813_InitDeviceCNT Lib "USB2813" (ByVal hDevice As Long, ByRef pCNTPara As USB2813_PARA_CNT, ByVal InitCNTVal As Integer, ByVal nCNTChannel As Integer) As BooleanDeclare Function USB2813_GetDeviceCNT Lib "USB2813" (ByVal hDevice As Long, ByRef CNTValue As Long) As Boolean
'####################### 数字I/O输入输出函数 #################################
Declare Function USB2813_SetDeviceDO Lib "USB2813" (ByVal hDevice As Long, ByRef pDOPara As USB2813_PARA_DO) As Boolean ' 开关状态Declare Function USB2813_GetDeviceDI Lib "USB2813" (ByVal hDevice As Long, ByRef pDIPara As USB2813_PARA_DI) As Boolean ' 开关状态'########################## 文件操作函数 ####################################
Declare Function USB2813_CreateFileObject Lib "USB2813" (ByVal hDevice As Long, ByVal strFileName As String, ByVal Mode As Integer) As Long ' 文件操作方式
Declare Function USB2813_WriteFile Lib "USB2813" (ByVal hFileObject As Long, ByRef pDataBuffer As Integer, ByVal nWriteSizeBytes As Long) As Boolean ' 缓冲区大小(字节)Declare Function USB2813_ReadFile Lib "USB2813" (ByVal hFileObject As Long, ByRef pDataBuffer As Integer, ByVal OffsetBytes As Long, ByVal nReadSizeBytes As Long) As Boolean ' 从偏移位置开始读的字节数Declare Function USB2813_SetFileOffset Lib "USB2813" (ByVal hFileObject As Long, ByVal nOffsetBytes As Long) As Boolean ' 文件偏移位置(以字为单位)Declare Function USB2813_GetFileLength Lib "USB2813" (ByVal hFileObject As Long) As Long ' 取得指定文件长度(字节)Declare Function USB2813_ReleaseFile Lib "USB2813" (ByVal hFileObject As Long) As Boolean
Declare Function USB2813_GetDiskFreeBytes Lib "USB2813" (ByRef strDiskName As String) As Currency ' 获得指定盘符的磁盘空间(注意使用64位变量)'############################ 线程操作函数 ################################
Declare Function USB2813_CreateSystemEvent Lib "USB2813" () As Long ' 创建内核系统事件对象
Declare Function USB2813_ReleaseSystemEvent Lib "USB2813" (ByVal hEvent As Long) As Boolean ' 释放内核事件对象
Declare Function USB2813_CreateVBThread Lib "USB2813" (ByRef hThread As Long, ByVal StartThread As Long) As Boolean
Declare Function USB2813_TerminateVBThread Lib "USB2813" (ByVal hThreadHandle As Long) As Boolean'################# 其他附加函数 ########################
Declare Function USB2813_EnableShowMessage Lib "USB2813" (Optional ByVal bShowMessage As Boolean = False) As Boolean ' 是否让驱动程序自动弹出错误信息提示对话框
Declare Function USB2813_DelayTimeUs Lib "USB2813" (ByVal nUs As Integer)
Declare Function USB2813_kbhit Lib "USB2813" (void) As Boolean
(具体是什么样,我也不清楚,从来没有写过VB.NET的代码)
至少,有关“API声明”那一部分,得完全改写……
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!
例子代码给你继续“受用”吧:
//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用
//A将请求数据写到文件a.txt,写完后改名为aa.txt
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
#include <io.h>
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv) {
int d,r;
FILE *f;
char cmdstr[512]; if (argc<2) {
sprintf(cmdstr,"cmd /c \"%s\" B",argv[0]);
WinExec(cmdstr,SW_HIDE);
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
return 0;
}
if (argv[1][0]=='a'||argv[1][0]=='A') {//A
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
} else {//B
while (1) {
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
while (1) {
Sleep(100);
if (_access("aa.txt",0)!=-1) {
f=fopen("aa.txt","r");
fscanf(f,"%d",&r);
fclose(f);
r=r*10;
f=fopen("b.txt","w");
fprintf(f,"%d\n",r);
fclose(f);
remove("aa.txt");
rename("b.txt","bb.txt");
break;
}
}
if (r==50) break;
}
}
return 0;
}
//C:\tmp\test>test
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>start /B test B
//
//C:\tmp\test>test A
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>
例子代码给你继续“受用”吧:
//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用
//A将请求数据写到文件a.txt,写完后改名为aa.txt
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
#include <io.h>
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv) {
int d,r;
FILE *f;
char cmdstr[512]; if (argc<2) {
sprintf(cmdstr,"cmd /c \"%s\" B",argv[0]);
WinExec(cmdstr,SW_HIDE);
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
return 0;
}
if (argv[1][0]=='a'||argv[1][0]=='A') {//A
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
} else {//B
while (1) {
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
while (1) {
Sleep(100);
if (_access("aa.txt",0)!=-1) {
f=fopen("aa.txt","r");
fscanf(f,"%d",&r);
fclose(f);
r=r*10;
f=fopen("b.txt","w");
fprintf(f,"%d\n",r);
fclose(f);
remove("aa.txt");
rename("b.txt","bb.txt");
break;
}
}
if (r==50) break;
}
}
return 0;
}
//C:\tmp\test>test
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>start /B test B
//
//C:\tmp\test>test A
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>
老赵真是老师?
索性多聊点吧,如果A发出了5个请求,B处理到第3个,然后A又需要发5个请求怎么办?你的代码完全没有考虑竞争,更不用说操作的原子性。分布式不是你想得那么简单三两句代码就行的。一旦操作频繁起来,程序之间抢资源要抢到打破头,解决了锁的问题,还有一个传输效率的问题,你肯定也没有考虑过,事实上文件是效率最低的,一旦有高频的、大体积的数据交互,资源都消耗在IO上,这个问题你肯定也没有考虑过。一板一眼地给学生做演示的时候,我觉得你写起代码肯定是信手拈来,但是老赵,真实的项目里不会这样做的,你觉得复制粘贴的这些语录都是你的心得,但是这些只是你拍脑门凭空拍出来的东西,你以为有些事很傻,但是反而是你想得太简单。更糟糕的是,你一边到处宣传这些一边吸引别人的关注,觉得自己是在传道,很有满足感,可事实上你到底用这套想当然的东西把多少人给带歪了?
还有,vb的归vb,.net的归.net,java的归java,c的归c……很多次见你为了甩代码而甩代码,这样不是合适的讨论方式。不然你回头再翻一翻你的回帖,是不是真正在讨论问题,是不是对题主有参考价值。
你要想验证一下也很简单,去.net版块,java版块,python版块连续复制粘贴刷三天,看看大家会怎么回复你。
例子代码给你继续“受用”吧:
//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用
//A将请求数据写到文件a.txt,写完后改名为aa.txt
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
#include <io.h>
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv) {
int d,r;
FILE *f;
char cmdstr[512]; if (argc<2) {
sprintf(cmdstr,"cmd /c \"%s\" B",argv[0]);
WinExec(cmdstr,SW_HIDE);
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
return 0;
}
if (argv[1][0]=='a'||argv[1][0]=='A') {//A
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
} else {//B
while (1) {
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
while (1) {
Sleep(100);
if (_access("aa.txt",0)!=-1) {
f=fopen("aa.txt","r");
fscanf(f,"%d",&r);
fclose(f);
r=r*10;
f=fopen("b.txt","w");
fprintf(f,"%d\n",r);
fclose(f);
remove("aa.txt");
rename("b.txt","bb.txt");
break;
}
}
if (r==50) break;
}
}
return 0;
}
//C:\tmp\test>test
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>start /B test B
//
//C:\tmp\test>test A
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>
老赵真是老师?
索性多聊点吧,如果A发出了5个请求,B处理到第3个,然后A又需要发5个请求怎么办?你的代码完全没有考虑竞争,更不用说操作的原子性。分布式不是你想得那么简单三两句代码就行的。一旦操作频繁起来,程序之间抢资源要抢到打破头,解决了锁的问题,还有一个传输效率的问题,你肯定也没有考虑过,事实上文件是效率最低的,一旦有高频的、大体积的数据交互,资源都消耗在IO上,这个问题你肯定也没有考虑过。一板一眼地给学生做演示的时候,我觉得你写起代码肯定是信手拈来,但是老赵,真实的项目里不会这样做的,你觉得复制粘贴的这些语录都是你的心得,但是这些只是你拍脑门凭空拍出来的东西,你以为有些事很傻,但是反而是你想得太简单。更糟糕的是,你一边到处宣传这些一边吸引别人的关注,觉得自己是在传道,很有满足感,可事实上你到底用这套想当然的东西把多少人给带歪了?
还有,vb的归vb,.net的归.net,java的归java,c的归c……很多次见你为了甩代码而甩代码,这样不是合适的讨论方式。不然你回头再翻一翻你的回帖,是不是真正在讨论问题,是不是对题主有参考价值。
你要想验证一下也很简单,去.net版块,java版块,python版块连续复制粘贴刷三天,看看大家会怎么回复你。
你好,首先感谢回帖。我不是专业码代码的,只是有时候做控制需要处理一些数据,因此对大家的观点不敢妄加评论。但是上述有一些我很赞同,在控制里面,很多时候每秒需要采集、计算和输出1000+数据,用文件在软件之间交换信息确实不太可能哈,低速的场合或许可以的。
我试了一下,代码经过简单的修改可以从VB转到VB,net,而且可以不报错调试打开软件界面,但是调用硬件初始化函数的时候就会出现“内存、堆栈、签名”关键词的报错。但是因为硬件厂商提供的底层函数用了*.lib,所以想看原函数不太可能。因此作罢。再次感谢你的回答!
例子代码给你继续“受用”吧:
//test.c 本程序演示两个进程之间通过临时文本文件交换数据实现间接调用
//A将请求数据写到文件a.txt,写完后改名为aa.txt
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
#include <io.h>
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv) {
int d,r;
FILE *f;
char cmdstr[512]; if (argc<2) {
sprintf(cmdstr,"cmd /c \"%s\" B",argv[0]);
WinExec(cmdstr,SW_HIDE);
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
return 0;
}
if (argv[1][0]=='a'||argv[1][0]=='A') {//A
for (d=1;d<=5;d++) {//共使用1..5调用B 5次
//A将请求数据写到文件a.txt,写完后改名为aa.txt
f=fopen("a.txt","w");
fprintf(f,"%d\n",d);
fclose(f);
rename("a.txt","aa.txt");
printf("call with %d\n",d);
//A发现bb.txt存在时,读取其内容,读完后删除bb.txt
while (1) {
Sleep(100);
if (_access("bb.txt",0)!=-1) {
f=fopen("bb.txt","r");
fscanf(f,"%d",&r);
fclose(f);
remove("bb.txt");
break;
}
}
printf("result:%d\n",r);
}
} else {//B
while (1) {
//B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
while (1) {
Sleep(100);
if (_access("aa.txt",0)!=-1) {
f=fopen("aa.txt","r");
fscanf(f,"%d",&r);
fclose(f);
r=r*10;
f=fopen("b.txt","w");
fprintf(f,"%d\n",r);
fclose(f);
remove("aa.txt");
rename("b.txt","bb.txt");
break;
}
}
if (r==50) break;
}
}
return 0;
}
//C:\tmp\test>test
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>start /B test B
//
//C:\tmp\test>test A
//call with 1
//result:10
//call with 2
//result:20
//call with 3
//result:30
//call with 4
//result:40
//call with 5
//result:50
//
//C:\tmp\test>
老赵真是老师?
索性多聊点吧,如果A发出了5个请求,B处理到第3个,然后A又需要发5个请求怎么办?你的代码完全没有考虑竞争,更不用说操作的原子性。分布式不是你想得那么简单三两句代码就行的。一旦操作频繁起来,程序之间抢资源要抢到打破头,解决了锁的问题,还有一个传输效率的问题,你肯定也没有考虑过,事实上文件是效率最低的,一旦有高频的、大体积的数据交互,资源都消耗在IO上,这个问题你肯定也没有考虑过。一板一眼地给学生做演示的时候,我觉得你写起代码肯定是信手拈来,但是老赵,真实的项目里不会这样做的,你觉得复制粘贴的这些语录都是你的心得,但是这些只是你拍脑门凭空拍出来的东西,你以为有些事很傻,但是反而是你想得太简单。更糟糕的是,你一边到处宣传这些一边吸引别人的关注,觉得自己是在传道,很有满足感,可事实上你到底用这套想当然的东西把多少人给带歪了?
还有,vb的归vb,.net的归.net,java的归java,c的归c……很多次见你为了甩代码而甩代码,这样不是合适的讨论方式。不然你回头再翻一翻你的回帖,是不是真正在讨论问题,是不是对题主有参考价值。
你要想验证一下也很简单,去.net版块,java版块,python版块连续复制粘贴刷三天,看看大家会怎么回复你。
赵4这套狗P理论,看着恶心死了…………还老是自以为是……
用他这种编程回想,不知道造就了多少垃圾代码!!!
也优雅,越精致的代码,越在实际中被束之高阁。请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。试对比
图书馆(对图书的分类够结构化了吧)
和
搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题:
◆“要保证这个问题不会再出现,我该怎么做?”
◆“要想少出些Bug,我该怎么做?”
◆“要保证Bug容易被修复,我该怎么做?”
◆“要保持对变化的快速响应,我该怎么做?”
◆“要保证我的软件的运行速度,我该怎么做?”
如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。