发布网友 发布时间:2022-04-10 05:04
共3个回答
懂视网 时间:2022-04-10 09:25
nsqlookupdimport (
"fmt"
"sync"
"sync/atomic"
"time"
)
//db(注册中心--内存数据库map)结构体
type RegistrationDB struct {
sync.RWMutex //读写锁
registrationMap map[Registration]Producers //
}
//代表一个生产者 主题 通道
type Registration struct {
Category string //主题
Key string //通道
SubKey string //
}
type Registrations []Registration
//代表客户端nsqd 的配置信息
type PeerInfo struct {
lastUpdate int64
id string
RemoteAddress string `json:"remote_address"`
Hostname string `json:"hostname"`
BroadcastAddress string `json:"broadcast_address"`
TCPPort int `json:"tcp_port"`
HTTPPort int `json:"http_port"`
Version string `json:"version"`
}
//生产者
type Producer struct {
peerInfo *PeerInfo
tombstoned bool
tombstonedAt time.Time
}
type Producers []*Producer
func (p *Producer) String() string {
return fmt.Sprintf("%s [%d, %d]", p.peerInfo.BroadcastAddress, p.peerInfo.TCPPort, p.peerInfo.HTTPPort)
}
func (p *Producer) Tombstone() {
p.tombstoned = true
p.tombstonedAt = time.Now()
}
func (p *Producer) IsTombstoned(lifetime time.Duration) bool {
return p.tombstoned && time.Now().Sub(p.tombstonedAt) < lifetime
}
func NewRegistrationDB() *RegistrationDB {
return &RegistrationDB{
registrationMap: make(map[Registration]Producers),
}
}
// add a registration key
func (r *RegistrationDB) AddRegistration(k Registration) {
r.Lock()
defer r.Unlock()
_, ok := r.registrationMap[k]
if !ok {
r.registrationMap[k] = Producers{}
}
}
// add a producer to a registration
func (r *RegistrationDB) AddProducer(k Registration, p *Producer) bool {
r.Lock()
defer r.Unlock()
producers := r.registrationMap[k]
found := false
for _, producer := range producers {
if producer.peerInfo.id == p.peerInfo.id {
found = true
}
}
if found == false {
r.registrationMap[k] = append(producers, p)
}
return !found
}
// remove a producer from a registration
func (r *RegistrationDB) RemoveProducer(k Registration, id string) (bool, int) {
r.Lock()
defer r.Unlock()
producers, ok := r.registrationMap[k]
if !ok {
return false, 0
}
removed := false
cleaned := Producers{}
for _, producer := range producers {
if producer.peerInfo.id != id {
cleaned = append(cleaned, producer)
} else {
removed = true
}
}
// Note: this leaves keys in the DB even if they have empty lists
r.registrationMap[k] = cleaned
return removed, len(cleaned)
}
// remove a Registration and all it‘s producers
func (r *RegistrationDB) RemoveRegistration(k Registration) {
r.Lock()
defer r.Unlock()
delete(r.registrationMap, k)
}
func (r *RegistrationDB) needFilter(key string, subkey string) bool {
return key == "*" || subkey == "*"
}
func (r *RegistrationDB) FindRegistrations(category string, key string, subkey string) Registrations {
r.RLock()
defer r.RUnlock()
if !r.needFilter(key, subkey) {
k := Registration{category, key, subkey}
if _, ok := r.registrationMap[k]; ok {
return Registrations{k}
}
return Registrations{}
}
results := Registrations{}
for k := range r.registrationMap {
if !k.IsMatch(category, key, subkey) {
continue
}
results = append(results, k)
}
return results
}
func (r *RegistrationDB) FindProducers(category string, key string, subkey string) Producers {
r.RLock()
defer r.RUnlock()
if !r.needFilter(key, subkey) {
k := Registration{category, key, subkey}
return r.registrationMap[k]
}
results := Producers{}
for k, producers := range r.registrationMap {
if !k.IsMatch(category, key, subkey) {
continue
}
for _, producer := range producers {
found := false
for _, p := range results {
if producer.peerInfo.id == p.peerInfo.id {
found = true
}
}
if found == false {
results = append(results, producer)
}
}
}
return results
}
func (r *RegistrationDB) LookupRegistrations(id string) Registrations {
r.RLock()
defer r.RUnlock()
results := Registrations{}
for k, producers := range r.registrationMap {
for _, p := range producers {
if p.peerInfo.id == id {
results = append(results, k)
break
}
}
}
return results
}
func (k Registration) IsMatch(category string, key string, subkey string) bool {
if category != k.Category {
return false
}
if key != "*" && k.Key != key {
return false
}
if subkey != "*" && k.SubKey != subkey {
return false
}
return true
}
func (rr Registrations) Filter(category string, key string, subkey string) Registrations {
output := Registrations{}
for _, k := range rr {
if k.IsMatch(category, key, subkey) {
output = append(output, k)
}
}
return output
}
func (rr Registrations) Keys() []string {
keys := make([]string, len(rr))
for i, k := range rr {
keys[i] = k.Key
}
return keys
}
func (rr Registrations) SubKeys() []string {
subkeys := make([]string, len(rr))
for i, k := range rr {
subkeys[i] = k.SubKey
}
return subkeys
}
func (pp Producers) FilterByActive(inactivityTimeout time.Duration, tombstoneLifetime time.Duration) Producers {
now := time.Now()
results := Producers{}
for _, p := range pp {
cur := time.Unix(0, atomic.LoadInt64(&p.peerInfo.lastUpdate))
if now.Sub(cur) > inactivityTimeout || p.IsTombstoned(tombstoneLifetime) {
continue
}
results = append(results, p)
}
return results
}
func (pp Producers) PeerInfo() []*PeerInfo {
results := []*PeerInfo{}
for _, p := range pp {
results = append(results, p.peerInfo)
var cpro_id = "u6292429";热心网友 时间:2022-04-10 06:33
我也碰到了这个问题,解决了。解决办法,自己的OLB库文件必须放置到X:\Cadence\SPB_16.3\tools\capture\library目录下。
另外一次的解决方法是:删除capture.ini,重启动 orcad cis,让它重建capture.ini。然后重新设置cis配置文件。热心网友 时间:2022-04-10 07:51
OrCAD CIS使用ICA可以在线查找众多厂商的元器件和相关的原理图,这样可以大大较少我们画原理图封装库的时间,例如NXP的LPC2131这些多引脚的封装,画起来是相当的耗时间。有了ICA的服务就相对简单多了,只要在线输入LPC2131就可查找出来它的器件的信息,包括原理图的封装和Datasheet的链接。
ICA功能的使用方法:
首先进入原理图的编辑界面,然后右击鼠标,出现“place database part”,然后会打开一个“CIS
Explorer”窗口,在状态栏下面会有“Local part database”的选项卡,旁边会有“Internet
Components Assistance”的选项卡,选择这个选项卡,就可以切换到ICA的功能了。
如果没有显示这个选项卡,请按照我文章中的方法注册相关的dll文件即可。
但当我在OrCAD中使用ICA的时候,弹出如下提示:“ICA Warning Dialog.Class in orpiica.dll Not Registered Internet Component”.
经过搜索,找到了官方的解答,英文原文如下:
其实关键的问题就是把以下这几个dll文件注册就行了:
· "C:\Program Files\Common Files\Orcad\CIS\orpiica.dll"
· "C:\Program Files\Common Files\Orcad\CIS\genlibcom.dll"
· "C:\Program Files\Common Files\Orcad\CIS\apconctl.dll"
· "C:\Program Files\Common Files\Microsoft shared\DAO\350.dll"
只要找到这几个文件,然后右击---“Register dll”就行了。
官方原文:
Error while launching CIS Explorer
PROBLEM:
The following error message appears while launching CIS Explorer in Capture CIS: “ICA Warning Dialog.Class in orpiica.dll Not Registered Internet Component”. Why?
SOLUTION:
This error message appears, if you install the OrCAD 10.3 software on a freshly formatted Windows XP/2000 machine, which does not have a previous installation of any of the OrCAD
procts. Also, this is e to improper registration of the following DLLs:
· "C:\Program Files\Common Files\Orcad\CIS\orpiica.dll"
· "C:\Program Files\Common Files\Orcad\CIS\genlibcom.dll"
· "C:\Program Files\Common Files\Orcad\CIS\apconctl.dll"
· "C:\Program Files\Common Files\Microsoft shared\DAO\350.dll"
The solution is to register these DLLs. To register these DLLs, the steps are:
1. Close Capture CIS.
2. Choose Start > Run to open the Run window.
3. Type cmd to open the command line window.
4. Go to <Install_dir>\tools\capture, where <Install_dir> is the path for the Capture CIS installation directory.//其实这里根本就找不到以上的dll文件,这是官方的失误,开始的时候我都被误导了,呵呵
5. Type the following commands, one at a time in the command line window:
regsvr32 orpiica.dll
regsvr32 genlibcom.dll
regsvr32 apconctl.dll
regsvr32 DAO\350.dll
After you register these DLLs, the missing ICA tab appears on the CIS Explorer window and then you can open the Active Parts website.
If you are unable to place parts from Active Parts, provide Write permissions to the installation directory.
Document number: CIS2AB
Applies to: CIS
Created on: 7/28/2005
Last modified: 07/28/2005
Copyright ? 2005, Cadence Design Systems, Inc.
All rights reserved.